psycopg2: динамическая таблица, столбцы и значения - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь использовать 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, vals из kvalues?

Спасибо!

1 Ответ

0 голосов
/ 23 апреля 2019

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

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