我正在编写一个与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
循环工作时的数据库。
答案 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")
这可确保您使用的每个查询都使用最新的提交快照。