如何在 mysql 中处理非常长的 SQL INSERT 语句
how to handle very long SQL INSERT statement in mysql
我正在使用以下 (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)
创建一个事务并逐个插入。最后提交。所以只在一次调用中所有插入操作提交。
您使用的 python 库是否支持准备好的参数化查询?我发现像这样的多值插入与重复执行准备好的语句(至少在 .Net 中)之间的性能差异在除极端情况外的所有情况下都是最小的。 (在那些情况下,两者的结合是最佳的。)
或者,只需跟踪您的查询长度,在它变得太大之前执行,然后重新初始化字符串并继续,直到处理完所有行。
我正在使用以下 (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)
创建一个事务并逐个插入。最后提交。所以只在一次调用中所有插入操作提交。
您使用的 python 库是否支持准备好的参数化查询?我发现像这样的多值插入与重复执行准备好的语句(至少在 .Net 中)之间的性能差异在除极端情况外的所有情况下都是最小的。 (在那些情况下,两者的结合是最佳的。)
或者,只需跟踪您的查询长度,在它变得太大之前执行,然后重新初始化字符串并继续,直到处理完所有行。