LoginSignup
13
13

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-05-28

目的

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

13
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
13