Mac OS X で PostgreSQL を使ってみよう (3)

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」と書かれていたからです。
EnterpriseDB ApachePhp installation directory
このフォルダを Finder でみてみましょう。
ApachePhp installation directory by 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日公開)