我正在用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起作用。
好的,db.autocommit(True)
解决了我的问题。
最佳实践是在执行所有查询后提交数据库db.commit()
这与MySQL服务器上的事务隔离级别有关。在REPEATABLE_READ
是InnoDb的默认级别的情况下,将在首次读取时创建快照,然后从该快照进行同一光标的后续读取。了解有关隔离级别here的更多信息>
我们在重复使用同一游标以运行多个查询时通常需要的是READ_COMMITTED
。幸运的是,如果您不能在SQL Server上更改此设置,则可以将光标设置为特定的隔离级别。
cur = conn.cursor() cur.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")
这将确保您进行的每个查询都使用一个最新的最新提交快照。