cursor.fetchone()返回None但数据库中的行存在

时间:2012-08-06 02:48:41

标签: python mysql mysql-python

我正在编写一个与MySQL数据库交互的python程序。 对于sql查询,我使用MySQLdb。 问题是fetchone()返回None但是使用数据库浏览器我可以看到那个行存在。 这段代码:

query = "SELECT * FROM revision WHERE rev_id=%s;" 
cursor.execute(query % revision_id)
row = cursor.fetchone()
if row == None:
    raise Exception("there isn't revision with id %s" % revision_id)

我不知道这里发生了什么。有什么想法吗?

编辑:好吧,在某些情况下,它可以在某些情况下起作用但它无论如何也是如此 不起作用表中存在的行。我将一个游标对象传递给一个函数,上面的代码在函数中。问题与此游标对象有关。问题是我将游标作为参数传递给函数吗?我该怎么测试呢?

EDIT2:是的,问题是我多次使用它后光标不起作用。因为其他程序连接到数据库或我做错了。 我有一个while循环,我在其中调用一个函数来从DB获取信息。经过一些迭代后,它不再起作用。还有另一个写入的程序 while循环工作时的数据库。

3 个答案:

答案 0 :(得分:3)

好的,db.autocommit(True)解决了我的问题。

答案 1 :(得分:0)

最佳实践是在所有查询执行后db.commit()

提交数据库

答案 2 :(得分:0)

这与MySQL服务器上的事务隔离级别有关。对于REPEATABLE_READ(它是InnoDb的默认级别),在第一次读取时创建快照,然后从同一快照进行同一光标的后续读取。详细了解隔离级别here

在重复使用同一游标以运行多个查询时,我们通常需要的是READ_COMMITTED。幸运的是,如果您不能在SQL Server上更改此设置,则可以将光标设置为特定的隔离级别。

cur = conn.cursor()
cur.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")

这可确保您使用的每个查询都使用最新的提交快照。