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