使用Jython和zxJDBC进行多行值的SQL INSERT
我正在用Jython编程,连接一个SQL数据库,使用的是com.ziclix.python.sql
这个包。我想知道这个包的预处理语句是否支持SQL的INSERT/UPDATE语句,可以一次性插入多行数据,而不仅仅是一行,这样我就可以在一个INSERT语句中插入多行。让我来解释一下。
这是一个基本的SQL插入语句:
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 INTO Names (FirstName, LastName) VALUES ("John", "Doe"), ("Mary", "Smith");
有没有什么方法可以用预处理语句来做到这一点?如果可以的话,我更希望使用预处理语句来构建SQL查询,而不是用字符串拼接。谢谢。
1 个回答
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只是重复调用execute,而没有优化查询。你可以尝试这样做:
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)))
这个方法确实需要一些字符串处理,但它保留了参数列表的使用,并且只需要与数据库进行一次往返。