代码之家  ›  专栏  ›  技术社区  ›  Aaron Watters

mysqldb总是将整个查询结果拉成一个块,即使我只是做了一个fetchone?

  •  5
  • Aaron Watters  · 技术社区  · 16 年前

    如果我这么做了

     import MySQLdb
     conn = MySQLdb.connect(...)
     cur = conn.cursor()
     cur.execute("SELECT * FROM HUGE_TABLE")
     print "hello?"
     print cur.fetchone() 
    

    我之前假设它在后台执行了某种“游标/状态”延迟检索, 但在我看来不是这样。 MySQL的wire协议?这是否意味着java/hibernate的行为方式相同?

    一张大桌子却不马上把整张桌子拉进去?还是没有?提前谢谢。

    3 回复  |  直到 16 年前
        1
  •  4
  •   Bill Karwin    16 年前

    _mysql 模块,使用以下调用:

    conn.use_result()
    

    这将告诉连接您希望逐个获取行,而将剩余的行留在服务器上(但将光标保持打开状态)。

    conn.store_result()
    

    这将告诉连接在执行查询后获取整个结果集,随后的获取将只迭代结果集,该结果集现在位于Python应用程序的内存中。如果你的结果集很大,你应该考虑使用 LIMIT 把它限制在你能处理的范围内。

    请注意,MySQL不允许运行另一个查询,除非您从一个未打开的行中提取了所有行。

    MySQLdb公司 MySQLdb.cusrors :

    • 游标用户结果混合
        2
  •  0
  •   Chuck Vose    16 年前

    我用过的每一种语言都是正确的。fetchone将只检索结果集的第一行,在本例中是整个数据库。这是一个比任何东西都更方便的方法,如果你知道只有一个结果,或者你只关心第一个结果,它的设计会更容易使用。

        3
  •  0
  •   Ignacio Vazquez-Abrams    16 年前