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

时间:2012-01-26 05:20:05

标签: python mysql-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 总是一个,即使我更新了我的数据库,使videos_id成为一个唯一的密钥。也就是说,插入失败是因为在我的测试中会出现相同的videos_id(当我检查数据库时,没有插入任何内容)。 但无论出于何种原因,rowcount始终为1 - 即使是logging.warn我已经吐出rowcount的1。

所以,问题是:
如果插入正常,我可以使用rowcount计算出来吗?如果是这样,我(大概)做错了什么? 否则,我如何检查插入是否正常?

5 个答案:

答案 0 :(得分:28)

修改后您的代码不会提交(您的修改将被回滚)。那就是你应该在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()

答案 1 :(得分:3)

我没有足够的声誉发表评论,但这是一个重要的注释:

如果在调用后没有提交,execute()也可能会无提示失败。也就是说,MyISAM表不需要提交,但InnoDB会这样做。

答案 2 :(得分:1)

如果插页失败,您将获得提出异常,或者有人会喊叫,否则您将从椅子上掉下来。

答案 3 :(得分:1)

如何使用try / catch块而不是查看rowcount。 如果它捕获异常则存在问题;否则,没问题。

答案 4 :(得分:0)

将insert语句存储在字符串中,然后打印。如果发生异常,则不会打印该语句。

sql_insert = """insert into new_files (videos_id, filename, is_processing)
values (%s,%s,1)"""
cur.execute(sql_insert)
print('Executed:', sql_insert)