使用 PostgreSQL copy_from、psycopg2 和 StringIO 批量插入
Bulk insert using PostgreSQL copy_from, psycopg2 and StringIO
我需要从 python 脚本在 Postgres table 中插入一堆行,并且正在使用建议使用 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',上面是一个示例。
但是 table 'temp_prices' 是空的,没有抛出任何错误
我知道我需要的数据写入了data_io,因为我使用的时候可以看到:
print (data_io.getvalue())
我做错了什么?
你没有找回起点。读取和写入文件使用 文件位置指针 ,它会在您每次写入文件或从文件中读回时前进。现在指针位于文件对象的末尾,所以读取不会 return 任何东西:
>>> import io
>>> data_io = io.StringIO()
>>> data_io.write("""%s\t%s\n""" % (115, 500))
8
>>> data_io.read()
''
在请求 copy_from
读取您的数据之前,使用 data_io.seek(0)
将文件位置放回开头:
>>> 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))
我需要从 python 脚本在 Postgres table 中插入一堆行,并且正在使用建议使用 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',上面是一个示例。
但是 table 'temp_prices' 是空的,没有抛出任何错误
我知道我需要的数据写入了data_io,因为我使用的时候可以看到:
print (data_io.getvalue())
我做错了什么?
你没有找回起点。读取和写入文件使用 文件位置指针 ,它会在您每次写入文件或从文件中读回时前进。现在指针位于文件对象的末尾,所以读取不会 return 任何东西:
>>> import io
>>> data_io = io.StringIO()
>>> data_io.write("""%s\t%s\n""" % (115, 500))
8
>>> data_io.read()
''
在请求 copy_from
读取您的数据之前,使用 data_io.seek(0)
将文件位置放回开头:
>>> 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))