戻る

PostgreSQLの使い方

PostgreSQLのインストール

 PostgreSQL はデータベース記述(操作?)言語である SQL を扱うサーバーソフトの一つで,Windows版の PostgreSQL は UNIX 互換環境の Cygwin 上で動作するようになっています.よってインストールも Cygwin のセットアップからインストールするようになります.次の URL を開いて「setup.exe」をダウンロードし,実行してください.

Cygwinセットアップダウンロードサイト:
 http://www.cygwin.com/

 setup.exe を実行するといろいろ聞かれますが, 適当に指定して「次へ」を押していってください. すると「Select Packages」の画面になるので, Database の中の postgresql を選んでください (Skipと書いた部分をクリックすれば選択されて現在のバージョンが表示されます. あとついでに Text の中にある more も選んでおきましょう). で,「次へ」を押していってインストールを開始してください. 必要なファイルが自動的にダウンロードされインストールされます.


選択画面

選択画面

PostgreSQL用のCygwin設定

 本来ならpostgresというデータベース管理用のユーザーを作って管理するのですが, 実験用(個人用)ならそこまでする必要はないので, そのままのユーザーで作成します. ウィンドウズへのユーザー名登録時に日本語, 正確には全角文字を使っていた場合様々なトラブルが予想されますが自分で解決してください. 個人的には半角英数のみを使ったユーザー名を新たに作成し, そのユーザーを中心に使うことをお勧めします.

 まず,cygwin 上で PostgreSQL を使うためにはいくつかの環境変数を登録する必要があります. 環境変数の登録は使用するシェルによって違うのですが, 普通 cygwin をインストールしただけなら bash というシェルが起動するはずなのでこのページではこの bash に環境変数を追加する方法を説明します (ここでいうシェルとは UNIX 用のコンソールソフトのことで, Windows で言えばコマンドプロンプトに相当するソフトです).

 環境変数を cygwin の実行環境(シェル) に登録するにはそのシェル用の環境設定ファイルに登録したい内容を追加します. シェルが bash の場合その環境設定用ファイルは .bashrc という名前のファイルなので, terapad等のUNIXの改行コードが扱えるエディタを使って c:\cygwin\home\ユーザー名\.bashrc というファイルを開き, その最後に次の記述を追加してください. (もし .bashrc というファイルがない場合は .profile に記述してください. これもない場合は以下の内容をメモ帳などのエディタに入力し, 上で書いたフォルダを選んでから「ファイル名」の欄に 「".profile"」とダブルクォーテーションを付けて入力し, このファイルを新規に作成してください)

export CYGWIN=server
export PATH=$PATH:/usr/sbin:/usr/local/pgsql/lib:/usr/local/pgsql/bin
export PGLIB=/usr/local/pgsql/lib
export PGDATA=/usr/local/pgsql/data

 追加できたらその状態でデスクトップにある cygwin のアイコンをダブルクリックするか,プログラムメニューの cygwin から Cygwin Bash Shell を選んで,cygwin のシェルを起動してください.
 shell が起動したらそのコマンドラインで次のように入力して cygserver というソフトを動かしてください.

cygserver &

 次にPostgreSQLのデータ初期化を行う. 初期化コマンドは initdb という命令で,この命令を実行することにより,PostgreSQL で作成したデータベースを格納するためのフォルダとファイルが用意される. なお,このフォルダは環境変数 PGDATA に定義したように /usr/local/postgres/data に作成される. なお,initdb にはいくつかのオプションを設定する必要があるので, cygwin の shell のコマンドラインで次のように入力してください. ここで, 「-E」のオプションはデータベースで日本語データを取り扱うための漢字コードを EUC に指定しています.従ってこのデータベースを呼び出す php ファイルも漢字コードを EUC にしないと問題が起きます ので注意してください. (Windows標準の ShiftJIS ではそもそもデータの登録の時点で問題が起きます) (phpファイルの中でデータベースからデータを取り出すときに SJIS に変換するよう指定することもできます)

initdb -E EUC_JP --no-locale

 いろいろメッセージが表示されますが,最終的に次のメッセージが表示されたら正しくデータファイルが作成されたといえます. ただし,WARNING 等のメッセージが大量に表示される場合はユーザー名等の情報がうまく登録されていない可能性があります. その場合は下の「大量の WARNING が表示された場合」の命令を実行し, cygwin のコンソールを再起動してみてください.

Success. You can now start the database server using:

    /usr/bin/postmaster -D /usr/local/pgsql/data
or
    /usr/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start

 大量の WARNING が表示された場合 (通常は必要ありません)

mkpasswd -l > /etc/passwd
mkgroup -l > /etc/group

 データファイルが作成されたらApacheのphpから利用する設定をします. 先程と同様 terapad 等のエディタで c:\cygwin\usr\local\pgsql\data の中の postgres.conf を開き, 次のように編集してください.

・30行目

tcpip_socket = true

・36行目(いらないかも)

port = 5432

 また,データベースのクライアントである psql に対しても漢字コードの設定をしておきます.次の内容を上の .bashrc と同じフォルダに .psqlrc という名前で保存してください.保存したらデータベースに関する設定はひとまず終りです.

\encoding SJIS

 なお,最後の設定については .bashrc に次の内容を追加しても同じ効果があります.

export PGCLIENTENCODING=SJIS

データベースサーバの起動と使い方

 設定が終わったらサーバを起動します. cygwinのコンソールで次のように入力してください.

pg_ctl start 

 サーバーが起動したらそのサーバー上に自分のユーザーとデータベースを作成します. cygwin のコンソールで次のコマンドを入力してください (ユーザー名やデータベース名には日本語やスペースを入れないでください). なお,最初の createuser を実行したときには「新しいデータベースを作れるようにするか」「新しいユーザーを作れるようにするか」という2つの質問が表示されるので,それぞれ y と n で答えてください.

createuser ユーザー名
createdb -O ユーザー名 データベース名

 データベースが作成できたら実際にデータが登録できるか試してみましょう. 次のコマンドを入力し,データベース用のコマンドラインを起動してください.

psql データベース名 ユーザー名

 起動したら次の命令を一行ずつ入力してみてください(「//」 の後ろはコメントなので入力しないでください).

CREATE TABLE kudamono ( id INTEGER PRIMARY KEY, namae TEXT, nedan INTEGER ); // テーブル作成
INSERT INTO kudamono VALUES ( 1, 'apple', 100 );       // データ登録
SELECT * FROM kudamono;                             // 登録データ表示

 最後の命令で次のような表示が出ればきちんとデータベースが動作しています. ご苦労様でした.

 id | name  | price
----+-------+-------
  1 | apple |   100
(1 row)

このように,ここまで来ればデータベースサーバである PostgreSQL が利用できる状態になっていますので,psql 上で SQL コマンドを入力し利用してください. なお,psql を終了する場合は Ctrl キーを押しながら d のキーを押してください.

 ここで psql の起動には「psql データベース名 ユーザー名」 とデータベース名とユーザー名を毎回指定するように書きましたが, 次のように環境変数を設定することでこれらの指定を省略することができます. 使用するデータベースや実行するユーザー名がほぼ変化しない人は以下の記述を .bashrc などの設定ファイルに追加してください.

export PGDATABASE=データベース名
export PGUSER=ユーザー名


 データベースを終了するときは次のように入力して終了メッセージを確認してから cygwin のウィンドウを閉じてください.

pg_ctl stop 

 万一終了処理をしなかった場合は次回起動時にいくつかエラーメッセージが表示されます.何かメッセージが表示されてうまく動かないときは一度再起動してから再度起動してみてください.

 なお,2度目からはデータファイルの作成などの手順が必要ないので, cygwin 起動後次の命令のみ入力して起動してください.

cygserver &
pg_ctl start

phpの設定

 データベースが動いたら apache に組み込まれた php から利用できるように php の設定を行います.apache.exe と同じフォルダに保存した php.ini を開き, それぞれの設定を以下のように変更してください.

・428行付近(php.iniがある場所からphpフォルダのextensionsフォルダの場所を示すようにしてください.絶対パス(C:/usr/local/php/extensions/ 等)で書いても大丈夫のようです)

extension_dir = "../php/extensions/"

・571行付近(コメントをはずす)

extension=php_pgsql.dll

 以上でApacheを起動したときにphpのモジュールが読み込まれ,同時にPostgreSQLのモジュールが読み込まれます.

 実際にウェブ上の php からデータベースを利用する場合は次のような命令で使用します.

 php ファイルの漢字コードが EUC の時

<html>
<head><title>データベース</title></head>
<body>
<h2>果物データベース</h2>
<?php
$db = pg_connect( "dbname=データベース名 user=ユーザー名" );
$sql = "select * from kudamono;";
$res = pg_query( $db, $sql );
$num = pg_num_rows( $res );

for( $i=0; $i<$num; $i++ ){
	$data = pg_fetch_array( $res, $i );
	print $data['namae'] . "の値段は" . $data['nedan'] . "です.<br>";
}
?>
</body>
</html>

 php ファイルの漢字コードが ShiftJIS の時

<html>
<head><title>データベース</title></head>
<body>
<h2>果物データベース</h2>
<?php
$db = pg_connect( "dbname=データベース名 user=ユーザー名" );
pg_set_client_encoding( "SJIS" );                  // この命令を追加
$sql = "select * from kudamono;";
$res = pg_query( $db, $sql );
$num = pg_num_rows( $res );

for( $i=0; $i<$num; $i++ ){
	$data = pg_fetch_array( $res, $i );
	print $data['name'] . "の値段は" . $data['price'] . "です.<br>";
}
?>
</body>
</html>

 なお,この例ではデータベースへの接続時に「user=」 でユーザー名を指定していますが, ここで指定するユーザーがデータベースの所有者と同じであった場合このphpファイルからデータベース上のテーブルに対してすべての命令が実行可能となってしまいます. くれぐれも任意の SQL 命令が実行できるような php を作成しないように気を付けてください.

 データベースのもうちょっと詳しい利用方については こちら を参照してください.

参考

 で,参考までに apache 上の php から PostgreSQL を利用する場合の準備手順を以下にまとめておきます.

  1. Apache をメニューをたどって起動する(phpは自動的に読み込まれる)
  2. cygwin のコンソールを起動し,次のコマンドで PostgreSQL を起動する.
    cygserver &
    pg_ctl start
    
  3. 終了するときは次のコマンドで PostgeSQL を停止する.
    pg_ctl stop
    
  4. cygwinのコンソールを閉じる.
  5. ApacheのコンソールでCtrl+Cで終了する

戻る