Mac OS X で PostgreSQL を使ってみよう (3)
4. 補足: postgres ユーザはどうなっているのか
ほかの OS 上で普段 PostgreSQL を使っているユーザにとっては postgres ユーザがどうなっているのか知りたいかもしれません。実際に Unix 的にユーザが存在するのか、ホームディレクトリがどこなのかなどを確かめてみましょう。
これはワン・クリック・インストーラで Unix 上に追加された postgres ユーザを簡易に理解するために書かれています。ですので、4. は読み飛ばしていただいてもなんら問題ありません。
ターミナルから postgres ユーザにスイッチするようコマンドを打ってみます。
~ sakai$ sudo su - postgres Password: ~ postgres$
あっけなく postgres ユーザになれました。ホームディレクトリはどこになるのでしょう?
$ cd ~ $ pwd /Library/PostgreSQL/8.3
ワン・クリック・インストーラで設定した(デフォルト表示されていた)「/Library/PostgreSQL/8.3」がホームディレクトリになっていますね。では postgres ならば psql できるのでしょうか?
$ psql -l -bash: psql: command not found見つからないと言われました。ではこのディレクトリ内の構成をみてみましょう。
$ ls -l total 0 drwxr-xr-x 31 root daemon 1054 May 16 13:33 bin drwx------ 17 postgres daemon 578 May 16 14:43 data drwxr-xr-x 7 root daemon 238 May 16 13:32 doc drwxr-xr-x 23 root daemon 782 May 16 13:32 include drwxr-xr-x 3 root daemon 102 May 16 13:32 installer drwxr-xr-x 20 root daemon 680 May 16 13:33 lib drwxr-xr-x 3 root daemon 102 May 16 13:32 pgAdmin3.app drwxr-xr-x 17 root daemon 578 May 16 13:33 scripts drwxr-xr-x 4 root daemon 136 May 16 13:32 share drwxr-xr-x 3 root daemon 102 May 16 13:32 stackbuilder.app drwxr-xr-x 3 root daemon 102 May 16 13:33 uninstall-postgresql.app「bin」が怪しそうですので、このパスを含んだ形で psql してみます。
$ ./bin/psql -l
Password:
List of databases
Name | Owner | Encoding
-----------+----------+----------
mydb | postgres | UTF8
postgres | postgres | UTF8
template0 | postgres | UTF8
template1 | postgres | UTF8
(4 rows)
パスワードは聞かれましたが、普通にコネクトできました。なるほど。パスが張られていないだけということになりますね。Mac OS X 10.5(Leopard)のユーザは dscl が使えますので、
$ dscl . -read /Users/postgres AppleMetaNodeLocation: /Local/Default NFSHomeDirectory: /Library/PostgreSQL/8.3 Password: * PrimaryGroupID: 1 RealName: PostgreSQL RecordName: postgres RecordType: dsRecTypeStandard:Users UniqueID: 502 UserShell: /bin/bash
このコマンドでいろいろな情報がみられます。なお、
$ dscl . -read /Groups/postgres <dscl_cmd> DS Error: -14136 (eDSRecordNotFound)
こちらはエラーになってしまうので、ワン・クリック・インストーラでは postgres グループは作成されないということが分かりました。
5. PHP で PostgreSQL を使う
phpPgAdmin をインストールしたのは、これで Apache / PHP 自体も同時に使えるようになるということでもあります。phpPgAdmin が http://localhost:8080/phpPgAdmin/ で動作しているので、この Apache は http://localhost:8080/ で動作していることも分かります。せっかくですから、ここで PHP スクリプトが動作するか確認してみましょう。まずはドキュメントルートがどこになるのかを探してみましょう。
注意深い読者の方であれば、多分あのディレクトリの中だろうと思う方もいるかもしれません。EnterpriseDB ApachePhp のインストール時の設定で、「Installation Directory」の初期値に「/Library/PostgreSQL/EnterpriseDB-ApachePhp」と書かれていたからです。


ならば、ターミナルでこんなファイルを作ってみましょう。筆者は vi を使いますが、Emacs でも pico / nano でもお好きなものを使ってください。
sudo vi /Library/PostgreSQL/EnterpriseDB-ApachePhp/apache/www/phpinfo.phpパスワードを聞かれたら、現時点でのユーザのパスワード(PostgreSQL の postgres ユーザのものではありません)を入力し、スクリプトの中身はたった一行、
<?php phpinfo(); ?>
これだけのシンプルなファイルを作ります。ブラウザで、
http://localhost:8080/phpinfo.php
にアクセスすると、PHP の様々な設定情報が表示され、ちゃんとスクリプトが動作していることが確認できました。今度はこの PHP が PostgreSQL に正しくコネクトできるかどうかをみてみましょう。
$ sudo vi /Library/PostgreSQL/EnterpriseDB-ApachePhp/apache/www/connect.php
として、簡単な PHP スクリプトを書いてみます。パスワードの「****」の部分はインストーラで設定したパスワードに書き換えてください。
<?php
$conn = pg_connect('host=localhost port=5432 dbname=postgres user=postgres password=****');
$res = pg_query(
$conn,
'SELECT tablename, pg_relation_size(tablename),'
. ' pg_size_pretty(pg_relation_size(tablename))'
. ' FROM pg_tables'
. ' WHERE tablename NOT LIKE \'sql_%\''
. ' ORDER BY 2 DESC'
);
// PostgreSQL 8.4.x では pg_relation_size の引数が
// text から regclass に変更になっているので、以下の様にキャストしてください。
/*
$res = pg_query(
$conn,
'SELECT tablename, pg_relation_size(tablename::regclass),'
. ' pg_size_pretty(pg_relation_size(tablename::regclass))'
. ' FROM pg_tables'
. ' WHERE tablename NOT LIKE \'sql_%\''
. ' ORDER BY 2 DESC'
);
*/
while($row = pg_fetch_row($res)) {
$all[] = array('table' => $row[0], 'size' => $row[2]);
}
?>
<html>
<head><title>Table Sizes</title></head>
<body>
<dl>
<?php foreach($all as $row): ?>
<dt><?php echo htmlspecialchars($row['table']); ?></dt>
<dd><?php echo htmlspecialchars($row['size']); ?></dd>
<?php endforeach; ?>
</dl>
</body>
</html>
うまくコネクトできていれば、システムテーブルのサイズが表示されるはずです。
http://localhost:8080/connect.php
いかがでしょう? テーブルのサイズは表示されましたでしょうか?
最後に
今回はワン・クリック・インストーラを使って簡単に PostgreSQL を使ってみました。また、PostgreSQL へのパスさえ正しく設定すれば、Perl や Ruby、Python などの言語でもインストール/連動の設定が可能だと思います。
また今回は「まずは使ってみること」を重点に置きました。ですので、セキュリティーに関しては甘めになっています。もし実際に使用するのであれば、的確に PostgreSQL のユーザを作成し、正しい権限を設定してください。また、phpinfo の内容は外部から見られないようにすべきですので、この点も注意してください。
(2009年5月19日公開)