如何检查使用MySQLdb在Python中插入是否成功?

17 投票
4 回答
40414 浏览
提问于 2025-04-17 11:07

我有这段代码:

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()

撰写回答