7.17.2014

Faster Insertion into PostgreSQL with Python

Python: PostgreSQL への高速インサート

 

Python + Psycopg で PostgreSQL の操作。

テーブルに大量データを投入する場合、INSERT よりも TSV (or CSV) ファイルを作って COPY で読み込んだ方が速いというのは知られているが、StringIO を利用すれば実際にファイルを作成する必要すらない、という例。

from StringIO import StringIO
import psycopg2

data = [[42, 'foo'], [74, 'bar']]

conn = psycopg2.connect(host = "localhost", port = 5432, database="dbname", user="user", password="pass")
cur = conn.cursor()

f = StringIO()
f.write('\n'.join('\t'.join(str(s) for s in r) for r in data))
f.seek(0)
cur.copy_from(f, 'tablename')

cur.close()
conn.close()

 

実行例

from StringIO import StringIO
import psycopg2

data = [[42, 'foo'], [74, 'bar']]

conn = psycopg2.connect(host = "localhost", port = 5432, database="dbname", user="user", password="pass")
cur = conn.cursor()

cur.execute('CREATE TABLE awesome_table (id integer NOT NULL, name character varying(40));')

f = StringIO()
f.write('\n'.join('\t'.join(str(s) for s in r) for r in data))
f.seek(0)
cur.copy_from(f, 'awesome_table')

cur.execute("select * from awesome_table;")
print(cur.fetchall())

cur.close()
conn.close()

 

出力
[(42, 'foo'), (74, 'bar')]

 

 

References

0 件のコメント:

コメントを投稿