首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cursor.fetchone()只返回数据库中的行

cursor.fetchone()只返回数据库中的行
EN

Stack Overflow用户
提问于 2012-08-06 02:48:40
回答 3查看 23.7K关注 0票数 8

我正在编写一个与MySQL数据库交互的python程序。对于sql查询,我使用MySQLdb。问题是,fetchone()不返回任何内容,但在数据库浏览器中,我可以看到存在行。这段代码:

代码语言:javascript
复制
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。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-06 04:32:54

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

票数 5
EN

Stack Overflow用户

发布于 2019-09-04 16:24:27

这与MySQL服务器上的事务隔离级别有关。对于REPEATABLE_READ (这是InnoDb的默认级别),在第一次读取时创建一个快照,然后由相同的游标从该快照读取。了解有关隔离级别这里的更多信息

在重用相同的游标来运行多个查询时,我们通常需要的是READ_COMMITTED。谢天谢地,如果您不能在SQL服务器上更改此操作,则可以将游标设置为特定的隔离级别。

代码语言:javascript
复制
cur = conn.cursor()
cur.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")

这确保您所做的每个查询都使用了一个新的最新提交快照。

票数 3
EN

Stack Overflow用户

发布于 2018-12-05 09:56:05

最佳实践是提交db,毕竟执行了所有查询db.commit()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11821976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档