我正在尝试使用 psycopg2.extras.execute_values(cursor, statement, argument_list) 函数在单个数据库调用中插入多条记录。 当我有一个仅包含字符串或整数作为字段值的列表时,它会起作用。 但我希望从 postgres 序列中分配 id 字段。 我尝试使用 nextval('name_of_sequence) 作为值,但它被视为字符串,因此对我的 id 列无效,这是一个开始。
两种处理方法。
1) 这样做:
alter <the_table> alter column id set default nextval('name_of_sequence').
那么你就不必在查询中指定 id 值。如果该序列专用于该 table.column,则还:
alter sequence name_of_sequence owned by <table_name>.id;
这将创建一个依赖关系,以便如果表被删除,序列也将是。
2)
让序列保持独立,并使用下面的过程根据需要提取值。
SQL 模式
create table py_seq_test(id bigint, fld_1 varchar);
create sequence py_seq;
Python代码
a) 定期执行
import psycopg2
con = psycopg2.connect("dbname=test host=localhost user=postgres")
cur = con.cursor()
cur.execute("insert into py_seq_test values(nextval('py_seq'), 'test1')")
con.commit()
cur.execute("insert into py_seq_test values(nextval('py_seq'), 'test2')")
con.commit()
cur.execute("select * from py_seq_test")
cur.fetchall()
[(1, 'test'), (2, 'test2')]
b) 执行值
from psycopg2.extras import execute_values
execute_values(cur,
"insert into py_seq_test values %s",
[('test3',), ('test4',) ],
template="(nextval('py_seq'), %s)")
con.commit()
cur.execute("select * from py_seq_test")
cur.fetchall()
[(1, 'test'), (2, 'test2'), (3, 'test3'), (4, 'test4']