SQL INSERT使用Jython和zxJDBC具有多行值

时间:2014-03-25 15:36:43

标签: python sql database prepared-statement jython

我使用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查询而不是字符串插值。感谢。

1 个答案:

答案 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)))

这个 涉及一些字符串操作,但它保留了参数列表的使用,并允许单个数据库往返。