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」と書かれていたからです。 このフォルダを Finder でみてみましょう。 「www」か「htdocs」が怪しそうです。両方を開いてみると「phpPgAdmin」というフォルダがあるのは「www」の方でした。
ならば、ターミナルでこんなファイルを作ってみましょう。筆者は 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日公開)