[英]Psycopg2 INSERT query string composition with execute_values
我正在嘗試使用 Psycopg2 的execute_values()
將數據插入 Postgresql 中的表中。 但是,當我使用“字符串組合”時,這項工作不斷失敗。 是否可以將字符串組合與execute_values()
使用?:
table='my_tab'
schema='my_schema'
col_lst = ['emp_id', 'emp_name', emp_age', 'emp_salary']
rec_lst = [('1234', 'John', 35, 10000), ('5678', 'Mike', 42, 15000), ('3452', 'Jason', 33, 15000)]
query = sql.SQL("INSERT INTO {schema}.{table} ({cols}) VALUES ({values});")
col_str = sql.SQL(', ').join(sql.Identifier(col) for col in col_lst)
place_holders = sql.SQL(', ').join(sql.Placeholder() * len(col_lst))
query = query.format(schema=sql.Identifier(schema), table=sql.Identifier(table), cols=col_str, values=place_holders)
psycopg2.extras_execute_values(cursor, query, rec_lst, page_size=1000)
錯誤: The query contains more than one '%s' placeholder...
任何人都可以請幫助解決相同的問題。
謝謝
工作示例
創建表:
create table my_tab(emp_id integer, emp_name varchar, emp_age integer, emp_salary integer);
\d my_tab
Table "public.my_tab"
Column | Type | Collation | Nullable | Default
------------+-------------------+-----------+----------+---------
emp_id | integer | | |
emp_name | character varying | | |
emp_age | integer | | |
emp_salary | integer | | |
Python代碼:
import psycopg2
from psycopg2 import sql
from psycopg2.extras import execute_values
table = 'my_tab'
schema = 'public'
col_lst = ['emp_id', 'emp_name', 'emp_age', 'emp_salary']
rec_lst = [('1234', 'John', 35, 10000), ('5678', 'Mike', 42, 15000), ('3452', 'Jason', 33, 15000)]
con = psycopg2.connect(dbname="test", host='localhost', user='postgres', port=5432)
cur = con.cursor()
query = sql.SQL("INSERT INTO {table}({cols}) values %s")\
.format(table=sql.Identifier(schema, table),
cols=sql.SQL(", ").join(map(sql.Identifier, col_lst)))
print(query.as_string(con))
INSERT INTO "public"."my_tab"("emp_id", "emp_name", "emp_age", "emp_salary") values %s
execute_values(cur, query, rec_lst)
con.commit()
cur.execute("select * from my_tab")
cur.fetchall()
[(1234, 'John', 35, 10000),
(5678, 'Mike', 42, 15000),
(3452, 'Jason', 33, 15000)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.