使用Python从PostgreSQL中提取BLOB-“;暂停“;起初

使用Python从PostgreSQL中提取BLOB-“;暂停“;起初,python,postgresql,blob,psycopg2,Python,Postgresql,Blob,Psycopg2,我想从单个文件中的行中提取BLOB,我使用的Python代码如下所示: connDB = psycopg2.connect( database=strDbName, user=strUser, password=strPass, host=strHost, port=strPort) cur = connDB.cursor() cmd = """ select id || '.pdf' as filename, blobColumn as binaryData from some

我想从单个文件中的行中提取BLOB,我使用的Python代码如下所示:

connDB = psycopg2.connect(
    database=strDbName, user=strUser, password=strPass,
    host=strHost, port=strPort)
cur = connDB.cursor()
cmd = """
select id || '.pdf' as filename, blobColumn as binaryData
from someTable
"""
cur.execute(cmd)
while True:
    row = cur.fetchone()
    if row is None: break
    print "Generating:", row[0]
    open(row[0], 'w').write(row[1][:])
这很好,但当表包含的行数超过(例如500行)时,我开始注意到启动脚本时出现延迟,就好像数据库在前面“拍照”,然后“给”我这张照片一样。最终的结果是有一段时间没有输出,然后水滴开始涌出

如果我的直觉是正确的:

  • 我非常希望避免这个“图片”——因为斑点很大,“图片”也会很大,会使数据库紧张,并无缘无故地延迟输出
  • 我正在考虑的另一种选择是读取前面所有行的id,将它们添加到Python数组中,然后在该数组上循环,每次迭代执行一个
    select blobColumn,其中id=…
    。这不是更好吗

感谢您提供的任何提示—尽管这是关于Python、PostgreSQL和psycopg2的,但我还是很想知道这是否是特定于DB引擎的,是否缺少psycopg2 API的更好使用,等等。

尝试使用
命名的游标。在
psycopg2
中,它默认为2000,但由于您注意到阈值在500左右,请尝试将其设置为远低于此值,例如100或200。只需向游标构造函数提供一个名称参数即可

命名游标
将允许
psycopg2
通过为您设置服务器端
游标
自动批量查询。在
Python
方面,您只需像往常一样进行迭代,必要时它将从服务器获取更多

此外,查看较大的表的
查询计划
,了解它们与较小的表之间的差异可能会很有帮助

如果使用
命名游标
,则在运行
执行
后,只需
迭代
,而不是调用
获取一个
或类似命令

i、 e


完美的建议,很有魅力。我所要做的就是切换到“cur=connDB.cursor(name='test')”,然后切换到“cur.itersize=10”-然后这些斑点立即开始出现。谢谢
for row in cur:
    # do stuff here