首页 > 解决方案 > 字符串缓冲区无法将数据写入数据库表

问题描述

我正在将 mongo 数据库移植到 PostgreSQL 数据库中,但遇到了一个问题。我正在使用psycopg2's COPY_FROM,它将文件对象、要写入的表和其他可选参数作为参数。我的原始代码如下所示:

records = '\n'.join(','.join([row['id'], row['att1'], row['att3']]) for row in data)
fio = io.StringIO(records)
cursor.copy_from(fio, 'mytable', sep=',')
postgres.commit()

上面的代码工作正常,但对于包含逗号的列(以逗号分隔)失败。因此,我想避开所有可能干扰的逗号和其他标点符号。为此,我使用了 Python 的csv模块来处理这个问题并得到以下代码:

fio = io.StringIO()
writer = csv.writer(fio)
writer.writerows([row['id'], row['att1'], row['att3']]) for row in data)
cursor.copy_from(fio, 'mytable', sep=',')
postgres.commit()

使用上面的代码,mytable无论如何都是空的。fio我在编写行后尝试迭代,内容与初始代码片段中的相同(使用','.join)。我还检查了对象的大小,在写入记录后它在两个片段中的大小大致相同。

我在这里想念什么?为什么在第二个示例中没有将数据写入表中?

标签: python-3.xpostgresqlstringiocsv-write-stream

解决方案


给你写信后fio在文件的末尾。当 psycopg2 读取它时,您需要返回开始。

容易修改,像这样:

fio = io.StringIO()
writer = csv.writer(fio)
writer.writerows([row['id'], row['att1'], row['att3']]) for row in data)

fio.seek(0) # Return to beginning of file.

cursor.copy_from(fio, 'mytable', sep=',')
postgres.commit()

推荐阅读