Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python mysqldb总是将整个查询结果拉到一个块中,即使我只是做一个fetchone?_Python_Mysql - Fatal编程技术网

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

Python mysqldb总是将整个查询结果拉到一个块中,即使我只是做一个fetchone?,python,mysql,Python,Mysql,所以如果我这样做了 import MySQLdb conn = MySQLdb.connect(...) cur = conn.cursor() cur.execute("SELECT * FROM HUGE_TABLE") print "hello?" print cur.fetchone() 在我看来,MySQLdb在“打印”之前就得到了整个巨大的表。 我之前假设它在后台执行某种“游标/状态”惰性检索, 但在我看来不是这样的。 是这样吗?如果是这样,是因为必须这样做,还是因为

所以如果我这样做了

 import MySQLdb
 conn = MySQLdb.connect(...)
 cur = conn.cursor()
 cur.execute("SELECT * FROM HUGE_TABLE")
 print "hello?"
 print cur.fetchone() 
在我看来,MySQLdb在“打印”之前就得到了整个巨大的表。 我之前假设它在后台执行某种“游标/状态”惰性检索, 但在我看来不是这样的。 是这样吗?如果是这样,是因为必须这样做,还是因为限制 MySQL wire协议的定义?这是否意味着java/hibernate的行为方式相同

我想我需要使用“limit1”MySQL子句和亲戚,如果我想通过
一张大桌子而不立刻把整个东西拉进去?还是不?提前谢谢。

这在我使用过的所有其他语言中都是正确的。fetchone只检索resultset的第一行,在本例中,它是整个数据库。这是一种更为方便的方法,如果你知道只有一个结果,或者你只关心第一个结果,那么它的设计会更容易使用

模块中,使用以下调用:

conn.use_result()
这会告诉连接您要逐个获取行,将其余的行保留在服务器上(但保持光标打开)

备选方案(以及默认方案)为:

这会告诉连接在执行查询后获取整个结果集,随后的获取只会迭代结果集,结果集现在位于Python应用程序的内存中。如果你的结果集非常大,你应该考虑使用 Lime将其限制为可以处理的东西。 请注意,MySQL不允许运行另一个查询,直到您从保持打开状态的查询中获取所有行

MySQLdb模块中,等效的方法是使用
MySQLdb.cusrors
中这两个不同的游标对象之一:

  • CursorUsersUltMixin
  • 游标存储结果混合

是另一种MySQL DB-API接口,它公开了更多的低级细节,还提供了处理大型数据集的其他功能。

谢谢,但是。。。use_result()方法存在,但我看不到它实际上改变了测试脚本中的计时行为。它真的有效吗?多个站点上的所有文档和示例都这么说,但我自己还没有用Python来衡量它。是否延迟是由于在获取任何结果之前执行查询造成的?如果它在将任何结果发送到客户端之前在服务器上缓存整个“select*from table”,则没有多大帮助。我只是尝试了一个“从表中选择*”,对一个大约有1300万行的表没有任何限制,它就放在那里。。。相比之下,“从表限制1中选择*”速度很快。。。
conn.store_result()