私はデータのブロックを持っています。現在は n タプルのリストですが、形式はかなり柔軟で、これを Postgres テーブルに追加したいと考えています。この場合、各 n タプルは DB の行に対応します。
これまで私がやってきたことは、これらすべてを CSV ファイルに書き込んでから、Postgres の COPY を使用してこれらすべてをデータベースに一括ロードすることでした。これは機能しますが、最適ではありません。すべてを Python から直接実行できるようにしたいです。Python 内で Postgres の COPY タイプの一括ロードを複製する方法はありますか?
ベストアンサー1
psycopg2 ドライバーを使用している場合、カーソルは、任意のファイルのようなオブジェクト (バッファを含む) から読み取ることができる関数をcopy_to
提供します。copy_from
StringIO
ファイルには例があります例/copy_from.pyそして例/copy_to.py付属のpsycopg2 ソース配布。
この抜粋は次の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')