Python
PostgreSQL

python の Psycopg を用いて、COPYコマンドを実行する

目的

pythonでPostgreSQLにCOPYコマンドを実行します。
psycopgにcopy_from関数があり、非常に簡単に分かりやすく処理することが出来ます。

この記事の作成時の環境

  • python:2.7.10
  • postgresql 9.4
  • PC: MacBook Pro (Retina, 13-inch, Mid 2014)

必要なライブラリ

  インストールは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型のカラムがあるテーブルにも有効です。