7.17.2014

Faster Insertion into PostgreSQL with Python

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

 

Python + Psycopg で PostgreSQL の操作。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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()

 

実行例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 件のコメント:

コメントを投稿