在Python中直接重现Postgres COPY?

20 投票
1 回答
9560 浏览
提问于 2025-04-15 16:48

我有一堆数据,现在是以n元组的形式存在,但格式挺灵活的。我想把这些数据添加到Postgres数据库的表里,在这里,每个n元组对应数据库中的一行。

到目前为止,我一直是先把这些数据写入一个CSV文件,然后再用Postgres的COPY命令把所有数据批量加载到数据库里。这种方法可以用,但不是最优的,我更希望能直接从Python中完成这个操作。请问在Python中有没有什么方法可以实现类似Postgres的COPY命令的批量加载?

1 个回答

53

如果你在使用psycopg2这个驱动程序,游标(cursors)提供了两个功能:copy_tocopy_from,它们可以从任何类似文件的对象读取数据(包括StringIO缓冲区)。

psycopg2的源代码包中,有一些示例文件,分别是examples/copy_from.pyexamples/copy_to.py

下面的内容摘自copy_from.py示例:

conn = psycopg2.connect(DSN)
curs = conn.cursor()
curs.execute("CREATE TABLE test_copy (fld1 text, fld2 text, fld3 int4)")

# anything can be used as a file if it has .read() and .readline() methods
data = StringIO.StringIO()
data.write('\n'.join(['Tom\tJenkins\t37',
                  'Madonna\t\N\t45',
                  'Federico\tDi Gregorio\t\N']))
data.seek(0)

curs.copy_from(data, 'test_copy')

撰写回答