字符串缓冲区无法将数据写入数据库 table
String buffer fails to write data to database table
我正在将 mongo 数据库移植到 PostgreSQL 数据库,但我遇到了一个问题。我正在使用 psycopg2
的 COPY_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()
我正在将 mongo 数据库移植到 PostgreSQL 数据库,但我遇到了一个问题。我正在使用 psycopg2
的 COPY_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()