#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))