PostgreSQL導入

lispとrubyとpythonと その9 DBアクセス(common lisp) - テンポラリに書いたようにclsql+MySQLだとプリペアドステートメントが使えない。
PostgreSQLに乗り換える。
しかし、PostgreSQLがさっぱり分からないので、一から調べないといけない。
メンドくさいなぁ。
動くようにはなったからやったことをまとめとく。
間違ってる部分があるかもしれないから鵜呑みにはしないこと。
環境はUbuntu8.10

まずインストール。
Synapticパッケージマネージャで入れるだけ。
インストールするとlinuxのユーザとしてpostgresってユーザを勝手に作るようだ。
/etc/passwdを確認したら増えてるはず。
こいつがPostgreSQLのデーモンを動かすんだろう。たぶん。
PostgreSQLが動いてる状態でps -auxすると

postgres 4650 0.0 0.6 41896 5208 ? S 19:49 0:00 /usr/lib/postgresql/8.3/bin/postgres -D /var/lib/
postgres 4652 0.0 0.2 41896 2172 ? Ss 19:49 0:01 postgres: writer process 
postgres 4653 0.0 0.1 41896 1296 ? Ss 19:49 0:00 postgres: wal writer process 
postgres 4654 0.0 0.1 42028 1544 ? Ss 19:49 0:00 postgres: autovacuum launcher process 
postgres 4655 0.0 0.1 13216 1288 ? Ss 19:49 0:00 postgres: stats collector process 

こんな感じだし。
ややこしいけど、PostgreSQLのユーザ(!=linuxのユーザ)にもpostgresが作られてて、こっちはPostgreSQLのAdmin(DBの)となっているらしい。

話を戻して追加されてるpostgresだけど、こいつのパスワードがわからないから、passwdで設定。

xxx@xxx:~$ sudo passwd postgres

で適当なのに変える。

インストールしたての状態だと、linuxのユーザがpostgresじゃないとPostreSQLにつながらない。(多分)
なので、パスワード設定後に端末で

su - postgres

して、(linuxの)ユーザをpostgresに切り替える。
この状態でPostgreSQLにつなぐとPostgreSQL側のユーザ・postgresでつながる。。。みたい。
で、ユーザのDBを作る。

CreateDB

とすればOK。これで、postgresのDBが作られる。

で、端末でpsqlとすればPostgreSQLにつながる。
つながったらこんな表示が出るはず。

postgres@xxx:~$ psql
Welcome to psql 8.3.6, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

postgres=# 

これで最低限動くようにはなったんだろうけど、端末からつなぐときにいちいち su - postgres するのも面倒くさい。
なので、普段のlinuxのユーザをPostgreSQL側にも作ってみた。
PostgreSQLのユーザはcreateuserコマンドで作れる。
端末で

postgres@xxx:~$ createuser test_user

と打つと、スーパーユーザにするかとか、なんだかんだと質問してくるので適当に答えてあげるとPostrgreSQLのユーザが作成される。
linuxのユーザ名と合わせたユーザをPostgreSQL側に作ったら、いちいちlinuxのユーザをpostgresに変えなくてもよくなった。
あ、こっちのユーザでもCreateDBするのは忘れずに。

で、テーブルを作成。
psqlでつないでから、

xxx=> create table tb0(
xxx(> id integer not null unique,
xxx(> data1 varchar(10),
xxx(> data2 varchar(10),
xxx(> CONSTRAINT id_key primary key(id));

その後、データを入れてみる。
MySQLではわりとハマった日本語もすんなり通っているように見える。

xxx=> insert into tb0 values(0,'あああああ','いいいいい');
INSERT 0 1
xxx=> select * from tb0;
id | data1 | data2 
----+------------+------------
0 | あああああ | いいいいい
(1 row)

うむ。いい感じ。
ただ、接続するときにパスワードを何も聞かれていないのが気持ち悪い。
http://my-server.homelinux.com/postgresql.php
↑を参考にパスワードを有効化してみる。

まずAlter Userでパスワード設定。

postgres@xxx:~$ psql
postgres=# alter user postgres with password 'x';

つぎに設定ファイルの変更。
/etc/postgresql/8.3/main/pg_hda.confを書き換える。
*参考にしたサイトでは/var/lib/pgsql/data/postgresql.confって書いてあったけど、Ubuntuでは/etc/postgresql/8.3/main/にあった。
postgresとlocalのallをmd5に変えてみた。

local all postgres md5
local all all md5

で再起動。

postgres@xxx:~$ /etc/init.d/postgresql-8.3 restart

再起動後はpsqlするとパスワードを聞かれるようになった。
これでいいか。

ついでに。
PostgreSQL側のユーザの一覧を見るのは

select usename from pg_user;

で。usernameじゃなくてusenameなので注意。