psycopg2:动态表,列和值

问题描述 投票:0回答:1

我正在尝试使用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,vals?

谢谢!

python postgresql psycopg2
1个回答
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))
© www.soinside.com 2019 - 2024. All rights reserved.