python-3.x - 字符串缓冲区无法将数据写入数据库表
问题描述
我正在将 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
)。我还检查了对象的大小,在写入记录后它在两个片段中的大小大致相同。
我在这里想念什么?为什么在第二个示例中没有将数据写入表中?
解决方案
给你写信后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()
推荐阅读
- java - maven shade没有用manifest创建胖罐
- arrays - 由于双 for 循环导致运行时问题
- android - 如何使用 Api 将 Api 文件发送到服务器?带改造2
- c# - 多线程套接字连接挂起 c#。套接字超时/挂起
- python - 具有分类数据的 Pandas 系列直方图
- ssis - 从 SSIS 运行 Winscp 执行进程任务
- clojure - 热修复“警告:任何?已经引用:#'clojure.core/any?在命名空间:leiningen.midje,被替换为:#'leiningen.midje/any?”
- r - 如何在R中提取列表的元素?
- javascript - 从无线电输入更改标签的图像
- sql - 记录集中没有结果