8

我正在编写一个与 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一个循环,我在其中调用一个函数来从数据库中获取信息。经过一些迭代后,它不再起作用。while还有另一个程序在循环工作时写入数据库。

4

3 回答 3

5

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

于 2012-08-06T04:32:54.933 回答
3

这与 MySQL 服务器上的事务隔离级别有关。如果REPEATABLE_READ是 InnoDb 的默认级别,则在第一次读取时创建一个快照,随后由同一个游标进行的读取都是从该快照进行的。在此处阅读有关隔离级别的更多信息

在重用同一个游标来运行多个查询时,我们通常需要的是READ_COMMITTED. 幸运的是,如果您无法在 SQL 服务器上更改此设置,您可以将光标设置为特定的隔离级别。

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

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

于 2019-09-04T16:24:27.630 回答
0

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

于 2018-12-05T09:56:05.920 回答