使用PostgreSQL copy_from,psycopg2和StringIO批量插入

问题描述 投票:0回答:1

我需要在python脚本的Postgres表中插入一堆行,并使用建议将copy_from用于性能目的。

import io
data_io = io.StringIO()

# here I have a loop which is omitted for simplicity
data_io.write("""%s\t%s\n""" % (115, 500))

DB = sql.DB()
DB._db_cur.copy_from(data_io, "temp_prices", columns=('id', 'price'))

在我的代码中,我使用一些循环来用值填充'data',上面是一个例子。

但是表'temp_prices'是空的并且没有抛出任何错误

我知道我需要的数据写入data_io,因为我在使用时可以看到它:

print (data_io.getvalue())

我究竟做错了什么?

python-3.x postgresql psycopg2 stringio
1个回答
1
投票

你没有回头开始。在文件中读取和写入使用文件位置指针,每次写入文件或从中读回时都会前进。现在指针位于文件对象的末尾,因此读取不会返回任何内容:

>>> import io
>>> data_io = io.StringIO()
>>> data_io.write("""%s\t%s\n""" % (115, 500))
8
>>> data_io.read()
''

在要求data_io.seek(0)读取您的数据之前,使用copy_from将文件位置放回到开头:

>>> data_io.seek(0)
0
>>> data_io.read()
'115\t500\n'

旁注:我使用csv module将制表符分隔的数据写入文件:

import csv

writer = csv.writer(data_io, delimiter='\t')
writer.writerow((115, 500))
© www.soinside.com 2019 - 2024. All rights reserved.