gpt4 book ai didi

python-3.x - 字符串缓冲区无法将数据写入数据库表

转载 作者:行者123 更新时间:2023-11-29 13:09:51 25 4
gpt4 key购买 nike

我正在将一个 mongo 数据库移植到一个 PostgreSQL 数据库,我遇到了一个问题。我正在使用 psycopg2COPY_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)。我还检查了对象的大小,在写入记录后,它在两个片段中的大小大致相同。

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

最佳答案

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

关于python-3.x - 字符串缓冲区无法将数据写入数据库表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56397498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com