Psycopg 2.7 中的新 execute_values
方法:
data = [(1,'x'), (2,'y')]
insert_query = 'insert into t (a, b) values %s'
psycopg2.extras.execute_values (
cursor, insert_query, data, template=None, page_size=100
)
在 Psycopg 2.6 中的 Pythonic 方式:
data = [(1,'x'), (2,'y')]
records_list_template = ','.join(['%s'] * len(data))
insert_query = 'insert into t (a, b) values {}'.format(records_list_template)
cursor.execute(insert_query, data)
说明:如果要插入的数据以元组列表的形式给出,如下所示:
data = [(1,'x'), (2,'y')]
那么它已经是所需格式的精确形式了
insert
子句的values
语法期望一个记录列表,如下所示:
insert into t (a, b) values (1, 'x'),(2, 'y')
Psycopg
将Python tuple
适配为Postgresql record
。
唯一必要的工作是提供一个记录列表模板,由psycopg填充
records_list_template = ','.join(['%s'] * len(data))
将其放入
insert
查询中。
insert_query = 'insert into t (a, b) values {}'.format(records_list_template)
打印insert_query
输出
insert into t (a, b) values %s,%s
现在来说一下通常的Psycopg
参数替换
cursor.execute(insert_query, data)
或者只是测试将发送到服务器的内容
print (cursor.mogrify(insert_query, data).decode('utf8'))
输出:
insert into t (a, b) values (1, 'x'),(2, 'y')
executemany
在每次插入后都会执行提交。如果您改为将整个操作包装在一个事务中,也许可以加快速度? - Richard+
连接起来似乎会导致 SQL 注入的风险,我觉得 @Clodoaldo Neto 的execute_values()
解决方案更安全。 - Will Munn