使用Jython和zxJDBC进行多行值的SQL INSERT

2 投票
1 回答
2384 浏览
提问于 2025-04-17 23:50

我正在用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)))

这个方法确实需要一些字符串处理,但它保留了参数列表的使用,并且只需要与数据库进行一次往返。

撰写回答