当其中一列是序列时,如何使用 psycopg2.extras.execute_values() 在表中插入多条记录?

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

我正在尝试使用 psycopg2.extras.execute_values(cursor, statement, argument_list) 函数在单个数据库调用中插入多条记录。 当我有一个仅包含字符串或整数作为字段值的列表时,它会起作用。 但我希望从 postgres 序列中分配 id 字段。 我尝试使用 nextval('name_of_sequence) 作为值,但它被视为字符串,因此对我的 id 列无效,这是一个开始。

python postgresql psycopg2
1个回答
0
投票

两种处理方法。

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']


© www.soinside.com 2019 - 2024. All rights reserved.