如何检查使用MySQLdb在Python中插入是否成功?
我有这段代码:
cursor = conn.cursor()
cursor.execute(("insert into new_files (videos_id, filename, "
"is_processing) values (%s,%s,1)"), (id, filename))
logging.warn("%d", cursor.rowcount)
if (cursor.rowcount == 1):
logging.info("inserted values %d, %s", id, filename)
else:
logging.warn("failed to insert values %d, %s", id, filename)
cursor.close()
虽然这段代码很有趣,但我发现 cursor.rowcount
总是返回 1,尽管我已经把数据库中的 videos_id
设置为唯一键。这意味着插入操作失败了,因为在我的测试中,videos_id
会重复出现(而且当我查看数据库时,发现没有任何数据被插入)。但是不管怎样,rowcount
总是显示为 1——即使我用 logging.warn
打印出来的 rowcount
也是 1。
所以,我想问的是:
我能用 rowcount
来判断插入是否成功吗?如果可以,那我可能哪里做错了?
如果不行,我该怎么检查插入是否成功呢?
4 个回答
1
不如用一个try/catch块来代替查看行数。
如果它捕捉到了一个异常,那就说明有问题;否则,就没问题。
5
我没有足够的声望来发表评论,但我想说一个重要的事情:
如果你在调用execute()之后没有进行提交,它可能会悄悄地失败。也就是说,MyISAM表不需要提交,但InnoDB表是需要的。
42
你的代码在修改后没有提交(也就是说,你的修改被撤销了)。也就是说,你应该在 cursor.execute
之后加上以下这一行:
conn.commit()
如果插入失败,会抛出 MySQLdb.IntegrityError
这个错误,所以你需要准备好去捕捉这个错误。
因此,你的代码应该像下面这样:
sql_insert = """insert into new_files (videos_id, filename, is_processing)
values (%s,%s,1)"""
cursor = conn.cursor()
try:
affected_count = cursor.execute(sql_insert, (id, filename))
conn.commit()
logging.warn("%d", affected_count)
logging.info("inserted values %d, %s", id, filename)
except MySQLdb.IntegrityError:
logging.warn("failed to insert values %d, %s", id, filename)
finally:
cursor.close()