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')]
0 件のコメント:
コメントを投稿