字符串缓冲区无法将数据写入数据库 table

String buffer fails to write data to database table

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

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)。我还检查了对象的大小,在写入记录后,它在两个片段中的大小大致相同。

我在这里错过了什么?为什么第二个例子中的数据没有写入 table?

写入 fio 后,您位于文件末尾。当 psycopg2 读取它时,您需要 return 开始。

修改简单,像这样:

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()