具有经过测试的漂亮的python PyPDF2代码,一个.py旨在在“真实” OS文件上运行。完成所有调试之后,我现在尝试将其合并到plPython函数中,用io.BytesIO()替换文件-或采用任何机制将是无缝插入的最佳选择...
文件读/写现在将通过tea cols发送到PostgreSQL。 “ in”文档已使用PG复制功能写入-字节数与磁盘大小匹配;到目前为止一切都很好。
原始代码预期文件:
# infile = "myInputPdf.pdf"
# outfile = "myOutputPdf.pdf"
# inputStream = open(infile, "rb") # designed to open OS-based file
# --- Instead: 'document_in' loaded from PG bytea col:
inputStream = io.BytesIO(document_in)
# ---
pdf_reader = PdfFileReader(inputStream, strict=False)
# (lots of code in here, seems? to be working)
outputStream = io.BytesIO() # trying it the python3 way!
pdf_writer.write(outputStream)
(我假设这些对象应被视为字节对象)
最后:
plan3 = plpy.prepare("UPDATE documents SET document_out=$2 WHERE name=$1", ["varchar"]["varchar"])
ERROR: TypeError: list indices must be integers, not str
(如果需要的话,是PostgreSQL 11.1)
过去使用mkstemp技术做过类似的事情;现在尝试成长为字节世界!
答案 0 :(得分:2)
plpy.prepare()
中的第二个参数是一个列表。列类型为bytea
,而不是varchar
。并且您应该使用bytes
(不是文件对象)来更新列:
plan3 = plpy.prepare("UPDATE documents SET document_out=$2 WHERE name=$1", ["varchar", "bytea"])
outputStream.seek(0)
bytes_out = outputStream.read()
plpy.execute(plan3, ['some name', bytes_out])