我有这段代码:
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
计算出来吗?如果是这样,我(大概)做错了什么?
否则,我如何检查插入是否正常?
答案 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)