#目的
pythonでPostgreSQLにCOPYコマンドを実行します。
psycopgにcopy_from関数があり、非常に簡単に分かりやすく処理することが出来ます。
この記事の作成時の環境
- python:2.7.10
- postgresql 9.4
- PC: MacBook Pro (Retina, 13-inch, Mid 2014)
必要なライブラリ
- Psycopg http://initd.org/psycopg/
インストールはPIPコマンドでも可能です。
詳しくは http://initd.org/psycopg/docs/install.html
#サンプルソースコード
TSV形式のpythonが実行されているマシン上に配置されているファイルを、PostgreSQLに対して投入します。
copy_from.py
import psycopg2
try:
# PostgreSQLへ接続
conn = psycopg2.connect("dbname='データベース名' user='ログインユーザ名' host='ホスト名' password='****'")
cur = conn.cursor()
conn.set_isolation_level(0)
#データベースに投入するファイルの読み込み
f = open('/ファイルパス/ファイル名' mode='r' encoding='utf-8') #文字コードを明示するとCOPY時のエラーが抑制出来ます。
#COPYの実行
cur.copy_from( f , 'テーブル名', sep='\t', null='\\N',columns=('カラム名1','カラム名2'))
# sep='デリミッタ文字種:例ではTAB記号'
# null='ヌル文字種:例ではNULL'
# columns=('') 入力対象のカラム名を順番に列挙、全カラムに投入を可能な場合は省略可能
conn.commit() #忘れずに!!
f.close()
print( "OK" )
except psycopg2.Error as e:
print( "NG Copy error! ")
print( e.pgerror )
#ポイント
##Psycopgのcopy_from関数の使い方
copy_from関数のポイントは、第1引数です。
file – file-like object to read data from. It must have both read() and readline() methods.
ファイル又は、ファイルのようなオブジェクトで、read()とreadline()の両方が存在していなければ成らないようです。
サンプルコードでは、TSVファイルをopen()関数で読み込んだ戻り値をわたしています。
また、colums では、入力対象のカラム名を指定できるため、serial型のカラムがあるテーブルにも有効です。