我使用com.ziclix.python.sql
包在Jython中编程到SQL数据库。我想知道包是否在SQL INSERT / UPDATE语句的预准备语句中支持您传递多行值而不是一行,以便您在一个INSERT语句中插入多行。让我解释一下。
这是一个基本的SQL INSERT语句:
INSERT INTO Names (FirstName, LastName) VALUES ("John", "Doe");
使用zxJDBC准备好的声明,这非常简单:
# Assume cursor object
statement = 'INSERT INTO Names (FirstName, LastName) VALUES (?, ?)'
cursor.execute(statement, ('John', 'Doe'))
但是我感兴趣的那种INSERT语句是你插入多行值的地方,如下所示:
INSERT INTO Names (FirstName, LastName) VALUES ("John", "Doe"), ("Mary", "Smith");
有没有办法使用预准备语句来做到这一点?如果可能的话,我宁愿使用预准备语句来构建SQL查询而不是字符串插值。感谢。
答案 0 :(得分:2)
因为zxJDBC实现了PEP 249" Python数据库API规范v2.0",您可以使用executemany()方法来完成此任务:
# Assume cursor object
statement = 'INSERT INTO Names (FirstName, LastName) VALUES (?, ?)'
cursor.executemany(statement, (
('John', 'Doe'),
('Mary', 'Smith'),
# ...
)
)
更新:看起来这太慢了,因为zxJDBC只是多次调用执行而不优化查询。相反,你可以这样做:
from itertools import chain
statement = 'INSERT INTO Names (FirstName, LastName) VALUES {values}'.format(
values = ','.join('(?, ?)' for _ in input_seq))
input_seq = (
('John', 'Doe'),
('Mary', 'Smith'),
# ...
)
cursor.execute(statement, list(chain(*input_seq)))
这个 涉及一些字符串操作,但它保留了参数列表的使用,并允许单个数据库往返。