在Python中直接重现Postgres COPY?
我有一堆数据,现在是以n元组的形式存在,但格式挺灵活的。我想把这些数据添加到Postgres数据库的表里,在这里,每个n元组对应数据库中的一行。
到目前为止,我一直是先把这些数据写入一个CSV文件,然后再用Postgres的COPY命令把所有数据批量加载到数据库里。这种方法可以用,但不是最优的,我更希望能直接从Python中完成这个操作。请问在Python中有没有什么方法可以实现类似Postgres的COPY命令的批量加载?
1 个回答
53
如果你在使用psycopg2这个驱动程序,游标(cursors)提供了两个功能:copy_to
和copy_from
,它们可以从任何类似文件的对象读取数据(包括StringIO
缓冲区)。
在psycopg2
的源代码包中,有一些示例文件,分别是examples/copy_from.py和examples/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')