【发布时间】:2014-06-16 22:54:18
【问题描述】:
我认为这会很简单,但无论出于何种原因,当脚本完成时数据不在表中。我正在生成一个包含 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 命令,它运行得很好,所以我没有任何错误的查询。任何帮助表示赞赏,因为我很难过。我知道有其他方法可以解决这个问题,但如果有人也可以解释为什么这个方法不起作用,那么我可以学习,那也将不胜感激!
更新: Mike 的回答在很大程度上是正确的,但我只是想用我的代码最终的样子来更新这篇文章。
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()
【问题讨论】:
-
回滚关闭一切后是否允许提交?因为这就是你在异常情况下所做的事情。您让执行路径流出 try/catch 语句并执行最后 3 个命令。如果有什么事情失败了,我至少会在那个时候出现异常。
-
它是单个字符串,但不是单个查询。许多提供程序不允许在单个查询中执行多个语句以防止 SQL 注入。如果它像这样
INSERT INTO Results (col1, col2, col3, col4, pass) VALUES ('%s', %s, %s, %s, 0), ('%s', %s, %s, %s, 0), ('%s', %s, %s, %s, 0)...,您可以将其作为单个查询执行(对不起,我不是 python 开发人员,但看起来这是可能的问题之一) -
没有发生异常,因此没有发生回滚和关闭。如果没有异常发生,最后 3 个命令执行得很好,但我仍然有一个空白表。我可以做不止一条语句,因为我可以复制/粘贴所有 1131 插入的字符串,并将其作为普通的 mysql 查询执行。您也不能在一次插入中包含超过 1000 个不同的 VALUES。
-
您确定在尝试插入记录时检查的是同一数据库中的记录吗?
-
是的....我确定。我只有一个。
标签: python mysql sql mysql-python