【发布时间】:2014-05-03 13:50:57
【问题描述】:
我正在使用 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 查询,而不是字符串插值。谢谢。
【问题讨论】:
-
你有理由不循环执行吗?带有选择的插入呢?
-
我可以循环执行,但我的理解是每次调用 cursor.execute 代表一个单独的数据库往返。在测试中我一次做 100 行,但在生产中它可能会比这高得多。在对 cursor.execute 的一次调用中插入多个值似乎是一种我不能没有的优化,因为如果我理解正确,那将只是到数据库的一次往返。
-
您对数据库的访问是正确的。尽管如此,你还是想知道它对你来说到底有多慢。如果尝试在不需要的地方进行优化,您可以编写一些糟糕的代码
-
如果您按照问题所示创建 sql,通过插值数据,您可以创建一个允许您插入多行的联合。
-
你是对的,它与多组值差别不大。尽管如此,准备好的语句只是字符串插值。可能您真正想要的是某种延迟执行,但我不确定除了手动构建字符串之外如何做到这一点,正如我们所讨论的那样。太糟糕了,你没有使用 c# 和 Linq。 :) 祝你好运!
标签: python sql database prepared-statement jython