我正在使用以下(python)代码生成(MySQL)SQL INSERT语句(有更多列,为简单起见,我将它们排除在外):
mylist = [('1', '2', '3'),
('4', '5', '6'),
.
.
.
('7', '8', '9')]
sql_statement = "insert into mytable (col1, col2, col3) values "
for i in mylist:
if sql_statement == "insert into mytable (col1, col2, col3) values ":
# append this for the 1st element
sql_statement += "(" + i[0] + ", " + i[1] + ", " + i[2] + ")"
else:
# append this for everything else
sql_statement += ", (" + i[0] + ", " + i[1] + ", " + i[2] + ")"
会产生如下字符串:
sql_statement = "insert into mytable (col1, col2, col3) values (1, 2, 3), (4, 5, 6), ... (7, 8, 9)"
然后我使用sql_statement
来执行sql语句。
这种方法的问题是sql_statement
字符串变长,插入不考虑所有数据。
有关如何处理此问题的任何建议吗?
更新: 准备好的声明是可行的方法。 (python)代码如下所示:
sql_statement = "insert into mytable (col1, col2, col3) values (%s, %s, %s)"
for i in mylist:
cursor.execute(sql_statement, i)
答案 0 :(得分:1)
创建一个事务并逐个插入。并最终提交它。所以只在一次调用中所有插入操作都提交。
答案 1 :(得分:1)
您使用的python库是否支持准备参数化查询?我发现在这种多值插入之间的性能差异和准备好的语句的重复执行(至少在.Net中)在极端情况下都是最小的。 (在这些情况下,两者的混合是最佳的。)
或者,只需跟踪您的查询长度,在它变得太大之前执行,然后重新初始化字符串&继续,直到处理完所有行。