18

現在nタプルのリストとしてデータのブロックがありますが、形式はかなり柔軟なので、Postgresテーブルに追加したいと思います。この場合、各nタプルはDBの行に対応します。

これまで私が行っていたのは、これらすべてをCSVファイルに書き込み、postgresのCOPYを使用してこれらすべてをデータベースに一括ロードすることです。これは機能しますが、最適ではありません。Pythonから直接これをすべて実行できるようにしたいと思います。python内からPostgresでCOPYタイプのバルクロードを複製する方法はありますか?

4

1 に答える 1

51

psycopg2ドライバーを使用している場合、カーソルは、ファイルのようなオブジェクト(バッファーを含む)から読み取ることができる関数を提供copy_toします。copy_fromStringIO

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')
于 2009-12-08T21:34:56.453 に答える