[PR]テレビ番組表
今夜の番組チェック


PostgreSQLのPythonインターフェース・PyGreSQL

 PyGreSQLは主にPC-UNIXで使われるフリーで高機能なRDBMS、PostgreSQL のデータをPythonのスクリプトで操作するためのPythonの拡張モジュールです。 PostgreSQLのソース配布に含まれていて、PostgreSQL 7.0.2に含まれる PyGreSQLのバージョンは2.4となっています。 RADKRAFTではこのバージョンのPyGreSQLをLinux 2.2.14 (Official Red Hat Linux 6.2J)上にインストールし、 日本語の扱いなども含めて動作が確認できたので、簡単に紹介してみます。

前準備
 PyGreSQLはPostgreSQLのソース配布の中に含まれていますが、 まず事前にPostgreSQLとPythonをインストールし、 コンパイルに使ったソースツリーを残しておきます。 ここではPostgreSQLのソースディレクトリを /home/ushi/install/postgresql-7.0.2、 Pythonのホームディレクトリを /home/ushi/install/Python-2.0 とし、PostgreSQLのインストールディレクトリを /usr/local/pgsql、 Pythonライブラリのインストールディレクトリを /usr/local/lib/python2.0 とします。 ディレクトリを変えた場合は以下の例を適宜読み替えてください。


コンパイル

 コンパイルは、Python Extensionのつくりかたのページで紹介した方法で行うことにします。

  1. PyGreSQLのソースディレクトリに行きます。ここから当分の作業は通常アカウントで行います。
    % cd /home/ushi/install/postgresql-7.0.2/src/interfaces/python
    
  2. Pythonのソース配布に含まれるMakefile.pre.inというファイルをコピーします。
    % cp /home/ushi/install/Python-2.0/Misc/Makefile.pre.in .
    
  3. 下のようなファイルを作り、「Setup」という名前で保存します。
    *shared*
    _pg  pgmodule.c -I/usr/local/pgsql/include -L/usr/local/pgsql/lib -lpq
    
  4. 次のようにしてMakefileを生成します。
    % make -f Makefile.pre.in boot
    
  5. Makefileができたら、コンパイルします。 _pgmodule.soというファイルができたら成功です。
    % make
    
  6. スーパーユーザーになり、pg.py(最初からある)と_pgmodule.so をそれぞれPythonのライブラリディレクトリ内にコピーします。
    # cp pg.py /usr/local/lib/python2.0
    # cp _pgmodule.so /usr/local/lib/python2.0/lib-dynload
    
    実際はこれらはPython処理系を起動して
    >>>import sys
    >>>sys.path
    
    と打ちこんだときに出てくるディレクトリならどこでも構わないのですが、 上のような位置が普通でしょう。


つかってみよう

 PyGreSQLの使い方は、 PostgreSQLの基本的なことがらが分かっていればとても簡単です。

#! /usr/local/bin/python
# PyGreSQLを使うには、モジュール「pg」をインポートします。
import pg

# PostgreSQLデータベースに接続するには、pg.connectを使います。
# これはpgobject(オブジェクト)を返します。
# 引数は全部で7つ(dbname, host, port, opt, tty, user, passwd)
# で、host以下は省略可能です。
con = pg.connect('partsdb')

# SQL文を実行するにはqueryメソッドを使います。
# 戻り値はSELECT文の場合はpgqueryobjectと呼ばれるオブジェクト、
# INSERT文なら新規行の行IDを表す整数、それ以外ならNoneです。
s = 'SELECT * FROM FAC_PARTS_MASTER'
qobj = con.query(s)

# SELECT文が返す行の数を事前に取り出すにはntuplesメソッドを使います。
print "rows=%d\n" % qobj.ntuples()

# SELECT文が返すフィールドを取り出すにはlistfieldメソッドを使います。
# 戻り値はフィールド名からなるたっぷるで、
# その長さが結果集合のフィールド数になります。
print str(qobj.listfields())

# qobjから結果を文字列で取り出すには、リストで取り出すgetresult()
# とディクショナリで取り出すdictresult()があります。
result = qobj.getresult()
for e in result:
  print "%-8s | %-10s | %-20s | %3s | %6d | %-6s" % e

# 行を追加してみます。
s = """
  INSERT INTO FAC_PARTS_MASTER VALUES
    ('CL127', 'CDE8K6218', 'トメネジ', 'B', 20, 'BNG422')
"""
con.query(s)

# closeメソッドでデータベース接続を終了します。
con.close()
# end.

セクションのサブメニューに戻る
(first uploaded 2000/11/11 last updated 2002/07/15)