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