我正在尝试使用psycopg2
来生成动态INSERT INTO
语句,其中表,列和值都是动态的。
我已经阅读了psycopg2.SQL class周围的文档,其中提供了一些提示,但是我无法获得最终结果。
# 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语句中添加值,但这也会产生更多错误。
如何生成一个动态插入语句,该语句从kvalues接受cols,val?
谢谢!
答案 0 :(得分:0)
问题与元组/列表格式有关。下面是有效的代码:
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))