Python で PostgreSQL (pgdb)
2005-12-24 作成 福島
2006-07-18 更新 福島
TOP > tips > python-pgdb
今回は rpm です。
Python は Fedore Core 2 に最初から入っているものを使用します。(バージョンは 2.3.3 でした)


PostgreSQL と pgdb のインストール

・postgresql 7.4.7 のインストール
$ su
# rpm -i postgresql-libs-7.4.7-3.FC2.1.i386.rpm
# rpm -i postgresql-7.4.7-3.FC2.1.i386.rpm
# rpm -i postgresql-server-7.4.7-3.FC2.1.i386.rpm
# su - postgres
postgres$ vi ~/data/postgresql.conf
設定ファイルを書き換えて、TCP/IP ソケットを有効にする
#tcpip_socket = false
tcpip_socket = true
postgres$ vi ~/data/pg_hba.conf
設定ファイルを書き換えて、ローカルユーザを trust にする (ホントは password にしたいけど、テストなので)
#local  all    all             ident   sameuser
local  all    all                     trust
postgres$ exit
# service postgresql start      postgres デーモン (postmaster) を起動
# exit
・pgdb のインストール
$ su
# rpm -i mx-2.0.5-3.i386.rpm     mx (Misc Extensions: 便利なツール集) をインストール
# rpm -i postgresql-python-7.4.7-3.FC2.1.i386.rpm     pgdb をインストール (上記 mx が必須: mx.DateTime を必要とします)


動作確認

・テスト用 DB を作成
$ psql -U postgres template1      template1 は DB の雛型です。変更はダメです。
template1=# CREATE USER testuser ;
template1=# ALTER USER testuser WITH PASSWORD 'password' ;
template1=# CREATE DATABASE testdb ;
template1=# GRANT ALL ON DATABASE testdb TO testuser ;
template1=# \q

$ psql -U postgres template1 -c "SELECT datname,datacl FROM pg_database"
  datname  |                          datacl
-----------+-----------------------------------------------------------
 testdb    | {=T/postgres,postgres=C*T*/postgres,testuser=CT/postgres}
 template1 | {postgres=C*T*/postgres}
 template0 | {postgres=C*T*/postgres}
(3 rows)
$ psql -U testuser testdb
testdb=> CREATE TABLE table1 (idx INT, val TEXT) ;
testdb=> \q
・pgdb を実行
  注意: python 2.3 からは、最初の 1〜2 行目に多バイトコードの宣言が必要です (リテラルやコメントに漢字を使う場合)
       例: # -*- coding: euc_jp  # -*- coding: Shift_JIS  # -*- coding: UTF-8

$ python <<EOF
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
# -*- coding: euc_jp
import pgdb
db = pgdb.connect(host='localhost:5432',database='testdb',user='testuser',password='password')
cursor = db.cursor() # カーソルの宣言
cursor.execute("INSERT INTO table1 VALUES ('1','AAA')") # INSERT 文を実行
cursor.execute("UPDATE table1 SET val = 'BBB' WHERE idx = '1'") # UPDATE 文を実行
cursor.execute("SELECT * FROM table1") # SELECT 文を実行
while 1: # SELECT の実行結果を全て表示
  row = cursor.fetchone()
  if not row: break
  print "idx:%s val:%s" % (row[0],row[1])
cursor.execute("DELETE FROM table1 WHERE idx = '1'") # DELETE 文を実行
cursor.close()
db.commit()
db.close()
EOF
idx:1 val:BBB     実行結果


・pgdb をソースからインストール

PostgreSQL をソースからインストールしたり、rpm を発見できなかった場合は pgdb をソースからインストールします。
$ tar xzf PyGreSQL.tgz
$ cd PyGreSQL-3.8.1        PyGreSQL.tgz を解凍して得られるバージョンは、ダウンロードした時期により異なります。
PyGreSQL-3.8.1$ python setup.py build
PyGreSQL-3.8.1$ su
PyGreSQL-3.8.1# python setup.py install