簡體   English   中英

帶有 execute_values 的 Psycopg2 INSERT 查詢字符串組合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM