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

问题描述 投票:3回答:3

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

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循环时DB起作用。

python mysql mysql-python
3个回答
3
投票

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


0
投票

最佳实践是在执行所有查询后提交数据库db.commit()


0
投票

这与MySQL服务器上的事务隔离级别有关。在REPEATABLE_READ是InnoDb的默认级别的情况下,将在首次读取时创建快照,然后从该快照进行同一光标的后续读取。了解有关隔离级别here的更多信息>

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

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

这将确保您进行的每个查询都使用一个最新的最新提交快照。

© www.soinside.com 2019 - 2024. All rights reserved.