【问题标题】:cursor.fetchone() returns None but row in the database existscursor.fetchone() 返回 None 但数据库中的行存在
【发布时间】:2012-08-03 01:14:45
【问题描述】:

我正在用 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 while 循环有效。

【问题讨论】:

  • print 查询字符串(及其替换)到屏幕并将其复制/粘贴到mysql 提示符中以确定。
  • 更好的是,使用参数化查询而不是替换。
  • 是的,查询字符串在 mysql promt 中工作正常
  • @IgnacioVazquez-Abrams 你能举个例子吗?
  • 一些想法:1)松开“;”在 sql 语句的末尾 2) 检查您如何连接到数据库。如果是 ODBC/DSN,您可能需要仔细检查 DSN 是否指向正确的数据库服务器

标签: python mysql mysql-python


【解决方案1】:

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

【讨论】:

  • connection.commit() 在您的execute(或db.commit(),取决于您所称的连接)之后可以手动执行相同的操作。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      相关资源
      最近更新 更多