Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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/4/webpack/2.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 psycopg何时执行游标命令_Python_Postgresql_Psycopg2 - Fatal编程技术网

Python psycopg何时执行游标命令

Python psycopg何时执行游标命令,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我正在使用psycopg2对数据库进行简单查询。目前,它是一个只有几个条目的测试数据库,但我担心我执行的命令在迁移到一个实际的数据库(可能很大)时会变得过于内存紧张 import psycopg2 connection = psycopg2.connect('<database_url>') cur = connection.cursor() cur.execute("SELECT * FROM test;") entries = cur.fetchmany(limit) 所以

我正在使用psycopg2对数据库进行简单查询。目前,它是一个只有几个条目的测试数据库,但我担心我执行的命令在迁移到一个实际的数据库(可能很大)时会变得过于内存紧张

import psycopg2

connection = psycopg2.connect('<database_url>')
cur = connection.cursor()

cur.execute("SELECT * FROM test;")
entries = cur.fetchmany(limit)
所以我的问题是。psycopg2是在执行行运行数据库查询,在这种情况下,大型数据库将消耗大量客户机内存,还是在fetchmany行之前不运行查询,在这种情况下,我可以控制python内存消耗


如果是前者,我可能需要将SQL查询更改为只返回x行。

要详细说明@Arihant的注释,调用execute时将运行该语句。这将触发数据库上的内存消耗。您可能不需要担心,但大小适中的数据库可以有效地处理数百万行;尽管如果查询本身变得复杂,内存开销可能会成为一个问题,但仍有许多优化和内存管理策略在使用

一旦开始提取数据,客户机内存就会发挥作用。我使用两种策略之一来控制内存使用:

使用fetchmany而不是fetchall vs将光标用作iterable。限制/偏移查询可以获得相同的基本结果,但您需要执行许多这样的查询以在大型数据集中分页,这会在服务器上产生不必要的成本

with conn.cursor() as stmt:
    stmt.execute('select * from big_table')
    rows = stmt.fetchmany(10000)
    while rows:
        for row in rows:
            #do something clever with the row
        rows = stmt.fetchmany(10000)
用户可以使用服务器端游标。这在服务器上的开销稍高,但会使客户机上的内存完全平坦,除非您试图保存所有记录

with conn.cursor('my_cursor') as stmt:
    stmt.execute('select * from big_table')
    for row in stmt:
        #do something clever with the row

不管采用何种方法,关键的是如何处理返回的记录。如果您试图将它们保存在内存中,则内存将耗尽。分块处理数据。

psycopg2在执行行中运行数据库查询。在查询中,您可以添加限制,但它不会以限制块的形式提供所有要处理的数据。您必须决定速度和内存的权衡。