纯 python 基于 postgresql/redshift 的驱动程序上是否有服务器端游标?
Is there a server-side cursor on pure python based postgresql/redshift driver?
我正在使用带有 Python 3 的 pg8000
包来查询 table,并注意到随着 table 的记录数量的增加,应用内存消耗也在增加现在已达到超过 16GB 的内存消耗。
在检查 pg8000
包的游标行为时,我发现游标在被任何 .fetchone()
、.fetchmany(n)
或 .fetchall()
方法。
在我的具体案例中,我在 AWS Redshift 上提取记录,方法是在 Glue 作业上使用 Python shell,但有 2 个限制:
- 不支持 Python 的基于 C 的包(不幸的是,不支持
psycopg
,它支持服务器端游标的缓存)
- 最大 16GB 内存。
我已经浏览了 pg8000
文档,但找不到任何关于设置服务器端游标的参考资料。无论如何要在 pg8000
上设置服务器端光标?或者是否有任何其他支持服务器端游标的 postgres/redshift 纯 Python 包?
pg8000 文档现在有 an example 个服务器端游标:
>>> import pg8000.native
>>>
>>> con = pg8000.native.Connection(username, password="cpsnow")
>>> con.run("START TRANSACTION")
[]
>>> con.run("DECLARE c SCROLL CURSOR FOR SELECT * FROM generate_series(1, 100)")
[]
>>> con.run("FETCH FORWARD 5 FROM c")
[[1], [2], [3], [4], [5]]
>>> con.run("MOVE FORWARD 50 FROM c")
[]
>>> con.run("FETCH BACKWARD 10 FROM c")
[[54], [53], [52], [51], [50], [49], [48], [47], [46], [45]]
>>> con.run("CLOSE c")
[]
>>> con.run("ROLLBACK")
[]
我正在使用带有 Python 3 的 pg8000
包来查询 table,并注意到随着 table 的记录数量的增加,应用内存消耗也在增加现在已达到超过 16GB 的内存消耗。
在检查 pg8000
包的游标行为时,我发现游标在被任何 .fetchone()
、.fetchmany(n)
或 .fetchall()
方法。
在我的具体案例中,我在 AWS Redshift 上提取记录,方法是在 Glue 作业上使用 Python shell,但有 2 个限制:
- 不支持 Python 的基于 C 的包(不幸的是,不支持
psycopg
,它支持服务器端游标的缓存) - 最大 16GB 内存。
我已经浏览了 pg8000
文档,但找不到任何关于设置服务器端游标的参考资料。无论如何要在 pg8000
上设置服务器端光标?或者是否有任何其他支持服务器端游标的 postgres/redshift 纯 Python 包?
pg8000 文档现在有 an example 个服务器端游标:
>>> import pg8000.native
>>>
>>> con = pg8000.native.Connection(username, password="cpsnow")
>>> con.run("START TRANSACTION")
[]
>>> con.run("DECLARE c SCROLL CURSOR FOR SELECT * FROM generate_series(1, 100)")
[]
>>> con.run("FETCH FORWARD 5 FROM c")
[[1], [2], [3], [4], [5]]
>>> con.run("MOVE FORWARD 50 FROM c")
[]
>>> con.run("FETCH BACKWARD 10 FROM c")
[[54], [53], [52], [51], [50], [49], [48], [47], [46], [45]]
>>> con.run("CLOSE c")
[]
>>> con.run("ROLLBACK")
[]