在开头使用Python“pause”从PostgreSQL中提取blob

2024-10-02 22:34:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从单个文件中的行中提取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 where id=...。这不是更好吗?在

感谢您的任何提示-尽管这是关于Python、PostgreSQL和psycopg2的,但我还是很想知道这是否是针对DB引擎的,是否缺少了一些更好地使用psycopg2api等


Tags: 文件代码cmdid数据库as图片数组
1条回答
网友
1楼 · 发布于 2024-10-02 22:34:21

尝试使用named cursor。它的默认值是psycopg2为2000,但是由于您注意到了一个大约为500的阈值,请尝试将其设置得比这个低得多,比如100或200。您只需向游标构造函数提供名称参数即可。在

named cursor将允许psycopg2通过为您设置服务器端cursor自动成批查询。在Python端,您只需像往常一样迭代,它将在必要时从服务器获取更多。在

另外,查看大尺寸表的query plan,看看它们与小表有什么不同,这可能是很有启发性的。在

如果使用named cursor,在运行execute之后,只需iterate而不是调用fetchone或类似函数。在

for row in cur:
    # do stuff here

相关问题 更多 >