gpt4 book ai didi

python - 在 1 个字符串中执行 1000 多个插入语句

转载 作者:行者123 更新时间:2023-11-29 08:02:37 36 4
gpt4 key购买 nike

我认为这个很简单,但无论出于何种原因,当脚本完成时数据并不在表中。我正在生成超过 1000 个查询的字符串,当前为 1131 个,它们之间用“;”分隔。

该字符串是由一个简单的 for 循环创建的:

query = ""

for: #loop condition
query += "INSERT INTO Results (col1, col2, col3, col4, pass) VALUES ('%s', %s, %s, %s, 0);" % (val1, val2, val3, val4)
logger.debug("SQL Query = %s" % query)

try:
cursor.execute(query, multi=True)
except MySQLdb.Error, e:
try:
logger.error("MySQL Error [%d]: %s" % (e.args[0], e.args[1]))
dbinit.cnx.rollback()
cursor.close()
dbinit.cnx.close()
except IndexError:
logger.error("MySQL Error: %s" % str(e))
dbinit.cnx.rollback()
cursor.close()
dbinit.cnx.close()

dbinit.cnx.commit()
cursor.close()
dbinit.cnx.close()

我没有收到任何错误,当我打印字符串时,它打印得很好。我什至可以复制/粘贴打印的内容,并一次运行所有 sql 命令,它运行得很好,所以我没有任何错误的查询。任何帮助都是值得赞赏的,因为我很困惑。我知道还有其他方法可以解决此问题,但如果有人也可以解释为什么这个方法不起作用,以便我可以学习,那也将不胜感激!

更新:迈克的答案在很大程度上是正确的,但我只是想用我的代码最终的样子来更新这篇文章。

queryData=[]
for: #condition
queryData.append((val1, val2, val3, val4, 0))

while len(queryData) != 0:
cursor.executemany("INSERT INTO Results (col1, col2, col3, col4, pass) VALUES (%s, %s, %s, %s, %s)", queryData[:999])
del queryData[:999]
dbinit.cnx.commit()

最佳答案

看起来您处理这个问题的方式是错误的。 cursor.execute()接受一个查询,准备它并使用您提供的数据执行它。在这一行

cursor.execute(query, multi=True)

您省略了第二个 params参数,因此没有数据可以执行。

您似乎正在将 1000 多个查询组装为一个字符串。你也许可以用 cursor.query() 来做到这一点,但这(如果有效的话)将导致服务器解析和准备本质上相同的查询 1000 多次,效率较低。无论如何,许多 MySQL 类明确禁止以这种方式组装多个查询。

您需要的是cursor.executemany(query, data)它构造一个具有多个值集的单个查询,一个值集对应 data 的每一行.

我不是 Python 开发人员,我看不到你从哪里获取数据,但这是 MySQL reference 中的示例,重新设计:

data = [
('col1-1', 1,2,3),
('col1-2', 4,5,6),
('col1-3', 7,8,9),
]
stmt = "INSERT INTO Results (col1, col2, col3, col4, pass) VALUES ('%s', %s, %s, %s, 0)"
cursor.executemany(stmt, data)

您可以添加自己的异常处理。希望这能让您开始。

注意:通过这种方式插入的值集数量没有限制,但可以创建的字符串长度有限制,默认情况下为 1Mb。如果您的要求超出此范围,您可以批量插入,例如一次 500 个,然后运行多个查询(3 个查询仍然优于 1500 个!)或查看 cursor.MySQLCursorPrepared该类解析一次查询并针对您发送的每组数据执行。

关于python - 在 1 个字符串中执行 1000 多个插入语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23391147/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com