【问题标题】:Bulk insert using PostgreSQL copy_from, psycopg2 and StringIO使用 PostgreSQL copy_from、psycopg2 和 StringIO 进行批量插入
【发布时间】:2019-03-15 11:12:36
【问题描述】:

我需要从 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'))

在我的代码中,我使用了一些循环来用值填充“数据”,上面是一个示例。

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

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

print (data_io.getvalue())

我做错了什么?

【问题讨论】:

    标签: python-3.x postgresql psycopg2 stringio


    【解决方案1】:

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

    >>> 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))
    

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 2021-01-10
      • 1970-01-01
      • 2012-08-20
      • 2020-05-04
      • 2021-07-09
      • 1970-01-01
      • 2012-03-31
      • 2014-11-14
      相关资源
      最近更新 更多