我正在编写一个与MySQL数据库交互的python程序。对于sql查询,我使用MySQLdb。问题是,fetchone()不返回任何内容,但在数据库浏览器中,我可以看到存在行。这段代码:
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:是的,问题是游标在我多次使用它之后就不能工作了。是不是因为其他程序连接到DB,或者我做错了什么。我有一个while循环,在这个循环中,我调用一个函数从DB获取信息。经过一些迭代之后,它不再工作了。还有一个程序可以在while循环工作时写入DB。
发布于 2012-08-06 04:32:54
好吧,db.autocommit(True)解决了我的问题。
发布于 2019-09-04 16:24:27
这与MySQL服务器上的事务隔离级别有关。对于REPEATABLE_READ (这是InnoDb的默认级别),在第一次读取时创建一个快照,然后由相同的游标从该快照读取。了解有关隔离级别这里的更多信息
在重用相同的游标来运行多个查询时,我们通常需要的是READ_COMMITTED。谢天谢地,如果您不能在SQL服务器上更改此操作,则可以将游标设置为特定的隔离级别。
cur = conn.cursor()
cur.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")这确保您所做的每个查询都使用了一个新的最新提交快照。
发布于 2018-12-05 09:56:05
最佳实践是提交db,毕竟执行了所有查询db.commit()。
https://stackoverflow.com/questions/11821976
复制相似问题