Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

目的

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

takahi
このサイトの掲載内容は私個人の見解であり、必ずしも私が所属する会社、組織、団体の立場、戦略、意見を代表するものではありません。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away