psycopg2: динамическая таблица, столбцы и значения

#python #postgresql #psycopg2

#python #postgresql #psycopg2

Вопрос:

Я пытаюсь использовать psycopg2 для генерации динамического INSERT INTO оператора, в котором таблица, столбцы и значения являются динамическими.

Я прочитал документацию по классу psycopg2.SQL, в которой содержатся некоторые подсказки, однако я не могу получить окончательный результат.

 # inputs to the DB. Keys represent COLS. 2 records.

kvalues = [{'first':11,'second':22},{'first':33,'second':44}]

table   = 'my_table'
columns = list(kvalues[0].keys())
values  = [list(kvalue.values()) for kvalue in kvalues]

# Generate SQL string
conn = psycopg2.connect(#...details..)
cur  = conn.cursor()

query_string = sql.SQL("INSERT INTO {} ({}) VALUES %s").format(
        sql.Identifier(table), 
        sql.SQL(', ').join(map(sql.Identifier, columns))).as_string(cur)

print(cur.mogrify(query_string, values))

#>> TypeError: not all arguments converted during string formatting
  

Я попытался добавить значения в инструкцию SQL, но это также приводит к большему количеству ошибок.

Как я могу сгенерировать оператор динамической вставки в, который принимает значения cols, val из значений kvalues?

Спасибо!

Ответ №1:

Проблема связана с форматированием кортежей / списков. Ниже приведен код, который работает:

 kvalues = [{'first':11,'second':22},{'first':33,'second':44}]

table   = 'my_table'
columns = list(kvalues[0].keys())
values  = [tuple(kvalue.values()) for kvalue in kvalues]

# Generate SQL string
conn = psycopg2.connect(#...details..)
cur  = conn.cursor()

query_string = sql.SQL("INSERT INTO {} ({}) VALUES {}").format(
        sql.Identifier(table),
        sql.SQL(', ').join(map(sql.Identifier, columns)),
        sql.SQL(', ').join(sql.Placeholder()*len(values)),
        ).as_string(cur)

print(cur.mogrify(query_string, values))