2013年05月11日(土)
RhodeCodeをPostgreSQLで使う
PostgreSQLをちょっとばかり理解したとおもうので、RhodeCodeをSQLiteでなくPostgreSQLで使えるようにしてみました。
一応、最初インストールするところから。
環境:Debian wheezy 64bit on VirtualBox
いろいろインストール
$ su -
# apt-get install python-dev python-virtualenv git libreadline6-dev libpq-dev vim
とりあえずいろいろインストールします。
pgvmのインストールとPostgreSQLのセットアップ
普通にPostgreSQLをインストールすれば良いのですが、pgvmで使ってみたかったのでpgvmをインストールします。
$ wget -qO - https://raw.github.com/guedes/pgvm/master/bin/pgvm-self-install | bash $ source ~/.bashrc
PostgreSQLをインストールします。
$ pgvm install 9 $ pgvm use 9.2.4 $ pgvm cluster create rhodecode $ pgvm cluster start rhodecode
PostgreSQLにロールとデータベースを作成します。
$ pgvm console rhodecode postgres=# CREATE ROLE rhodecode LOGIN; postgres=# CREATE DATABASE rhodecode OWNER rhodecode; postgres=# \q
libqpにパスを通す必要があるようなので、ld.so.conf.dにpostgresql.confを作成します。
$ su - # echo "/home/sasaplus1/.pgvm/environments/9.2.4/lib" > /etc/ld.so.conf.d/postgresql.conf # ldconfig
こんな方法があるなんて知らなかった……
virtualenv環境にRhodeCodeをインストール
virtualenv環境にRhodeCodeをインストールします。RhodeCodeでPostgreSQLを扱う際に、psycopg2というモジュールも必要なようなので一緒にインストールします。
$ virtualenv rhodecode $ cd rhodecode $ source bin/activate (rhodecode)$ easy_install rhodecode (rhodecode)$ easy_install psycopg2 (rhodecode)$ paster make-config RhodeCode production.ini
production.iniを編集します。
host = 0.0.0.0 lang = ja # sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db # sqlalchemy.db1.url = postgresql://user:pass@localhost/rhodecode sqlalchemy.db1.url = postgresql://rhodecode@localhost:5433/rhodecode
host, lang, sqlalchemyの辺りを書き換えれば大体良い気がします。
PostgreSQLはpgvmでインストールした場合、ポートが5432でなく5433からなのでその辺も忘れずに。
(rhodecode)$ mkdir repos (rhodecode)$ paster setup-rhodecode production.ini
これで設定時にいろいろ答えれば正常にセットアップは終了するかと。
起動する
(rhodecode)$ paster serve production.ini --daemon
これで起動します。
停止するときは
$ paster serve production.ini stop
で。
でもまあ、本格的にするならちゃんとrhodecode用のユーザを作った方が良いと思いますが。
あとついでにgunicornでも動作させられるようなので、それも入れたかったかなーと。
でもそれは今度にしようかと。とりあえず今回はここまで。
参考:
githubクローンのgitlabを挫折した人が、bitbucketクローン?をRDBMSでRhodecodeを導入してみた - コロタエンヂニアリング
2013年05月09日(木)
はじめてのPostgreSQL 9.1.5文書 第十八章〜第二十章
PostgreSQL 9.1.5文書読んでたのだけど、四章から意味わからなくなってきたのでとりあえず十八章あたりからの設定ファイルとかセキュリティ?関連の辺りを読んで、とりあえずセットアップできるようになってからPostgreSQL入門的な本やら記事やらを読もうかと。
18.1 パラメータの設定
- パラメータは大文字小文字の区別をしない
- 論理値はon, off, true, false, yes, no, 1, 0以外にもすぐに推測できる接頭文字を記述できる
listen_addresses (string)
クライアントアプリケーションからの接続サーバが監視するTCP/IPアドレスを指定するパラメータ。
値にはホスト名をコンマで区切ったリスト、もしくは数値によるIPアドレスを指定できる。
"*"は利用可能なすべてのIPに対応する。
0.0.0.0はすべてのIPv4の、::はすべてのIPv6アドレスの監視を許容する。
port (integer)
TCPポートで、デフォルトでは5432が指定される。
サーバが監視するすべてのIPアドレスに対して同じポート番号が使用される。
このパラメータはサーバ起動時のみ設定可能。
max_connections (integer)
最大同時接続数の設定。デフォルトでは100接続。
19.1 pg_hba.confファイル
HBAはhost-based authenticationの略みたい。
外部からのPostgreSQLへのアクセスに関する設定ファイルで、/etcなどにあったような気がします。
今の環境はpgvmを使っているので$HOME/.pgvm/clusters/9.1.9/test/pg_hba.confにありました。
設定方法は以下のような感じ。
host [database] [user] [CIDR-address] [method] host [database] [user] [IP-address] [IP-mask] [method]
ちゃんと値で書くと以下のような感じ。
host all all 192.168.0.0/24 md5 host all all 192.168.1.0 255.255.255.0 md5
このファイルに書くレコードは順序が大切みたい。
- はじめの方のレコードには厳しい接続照合パラメータと緩い認証方式
- 終わりの方のレコードにはより緩い章が追うパラメータとより厳しい認証方式
というのを意識して書かないといけない。
local all all 127.0.0.1/32 trust host all all 192.168.1.0/24 md5
みたいな感じかな。
ちなみにpg_hba.confの設定を通過する他に、そのデータベースに対するCONNECT権限を持っている必要がある。
pg_hba.confは起動時、もしくは稼働中にSIGHUPシグナルを受け取ったときに読み込まれる。
$ pg_ctl reload
をするか、もしくは
$ kill -HUP
でpostmasterに対してシグナルを送ると読み込み直す。
20.1 データベースロール
ロールの作成・破棄・変更など。
> CREATE ROLE name;
もしくは
$ createuser name;
で作成。
> DROP ROLE name;
もしくは
$ dropuser name;
で破棄。
変更は
> ALTER ROLE
で。
一覧を見る場合は
> SELECT * FROM pg_roles; > \du
のどちらか。
CREATEDBとCREATEROLEを持ったロールを作成して、そのロールでデータベースの操作をすると、
スーパーユーザで実行する危険性を避けられる。Linuxでの普段は一般ユーザを使う、みたいな感じ。
とりあえずここまでかなー。二十と二十一はまたあとで書く。
はじめてのPostgreSQL 9.1.5文書 第二十章(2)〜第二十一章
二十章まで書いたやつの続き。というか文章自体は既に書いてあるからただの清書みたいな感じなんだけど。
20.3 ロールのメンバ資格
CREATE ROLEでメンバグループ用のロールを作成する。
> CREATE ROLE name;
メンバグループの追加。
> GRANT group_role TO role1, ...;
メンバグループの削除。
> REVOKE group_role FROM role1, ...;
ロールの継承。OOP的な。
> CREATE ROLE xxx LOGIN INHERIT;
ロールの非継承。
> CREATE ROLE yyy NOINHERIT; > CREATE ROLE zzz NOINHERIT;
ロールを変更する?
> SET ROLE xxx;
変更されたロールを元に戻す。
> RESET ROLE xxx;
以下でロールを削除する。
> DROP ROLE name;
なんかこの辺、理解が微妙かも。
21.1 概要
データベースを確認するには
> SELECT * FROM pg_database;
もしくは
> \l
を実行する。
データベースの作成とともに、所有者を設定するときは
> CREATE DATABASE dbname OWNER rolename;
もしくは
$ createdb -O rolename dbname
を実行する。
CREATE DATABASEは既存のデータベースをコピーする。
デフォルトではtemplate1という名前の標準のシステムデータベースをコピーする。
なので、template1にオブジェクトを追加した後にCREATE DATABASEを実行するとその変更も新しいデータベースにコピーされる。
template0という名前の二次的な標準システムデータベースもあり、template1の初期内容と同じデータが含まれている。
template1でなくtemplate0をテンプレートとしてデータベースを作成する場合は
> CREATE DATABASE dbname TEMPLATE template0;
もしくは
$ createdb -T template0 dbname
を実行する。
データベースの削除は
> DROP DATABASE name;
削除しているデータベースに接続している場合はDROP DATABASEは実行できないので、template1データベースに接続するしかない。
シェルからの場合はこちら。
$ dropdb dbname
> CREATE TABLESPACE > DROP TABLESPACE > SELECT * FROM pg_tablespace; > \db
頑張って読んだけどよくわからない……
なんか大分いい加減な感じになった……
でもなんとか本当に基本的なところはわかった気がするから、他の本とかいろいろ参考にしながら知識を得て行きたいかなーと。
2013年05月04日(土)
はじめてのPostgreSQL 9.1.5文書 第四章〜第五章
読んでみたけど、さっぱり意味がわからないので今のレベルで読むものじゃないみたい。
たぶん、もうちょっとPostgreSQLを使ったり、SQL書いたりしたあとに正確な知識を持っておきたいってときに読んだ方が良いのだと思う。
なので今は置いておいて、なにか他のものを読むなり実践するなりした方がよいのかなーと。
でもとりあえずアカウントとか権限の管理くらいは読んでおいた方がいいのかな。
あとPostgreSQLはどの本がおすすめなんだろう。探さなきゃ。
2013年04月30日(火)
はじめてのPostgreSQL 9.1.5文書 第三章
PostgreSQL 9.1.5文書の第三章を読んだ。なかなか難しい……
環境:Ubuntu 12.04 LTS 64bit / PostgreSQL 9.1.9 - pgvm
3.2 ビュー
問い合わせをビューとして作成すると、テーブル参照のような形で結果を参照することができる。
mydb=# CREATE VIEW myview AS mydb-# SELECT city, temp_lo, temp_hi, prcp, date, location mydb-# FROM weather, cities mydb-# WHERE city = name; CREATE VIEW mydb=# SELECT * FROM myview;
エイリアスみたいな感じかな。
3.3 外部キー
citiesテーブルに一致する項目がない行はweatherテーブルに挿入できないようにしたい場合。データの参照整合性の保全とか言うみたい。
mydb=# CREATE TABLE cities ( mydb(# city varchar(80) primary key, mydb(# location point mydb(# ); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "cities_pkey" for table "cities" CREATE TABLE mydb=# CREATE TABLE weather ( mydb(# city varchar(80) references cities(city), mydb(# temp_lo int, mydb(# temp_hi int, mydb(# prcp real, mydb(# date date mydb(# ); CREATE TABLE
weatherテーブルの作成に指定したreferencesがキモなのかな。
mydb=# INSERT INTO weather VALUES('Berkeley', 45, 53, 0.0, '1994-11-28'); ERROR: insert or update on table "weather" violates foreign key constraint "weather_city_fkey" DETAIL: Key (city)=(Berkeley) is not present in table "cities". STATEMENT: INSERT INTO weather VALUES('Berkeley', 45, 53, 0.0, '1994-11-28'); ERROR: insert or update on table "weather" violates foreign key constraint "weather_city_fkey" DETAIL: Key (city)=(Berkeley) is not present in table "cities".
citiesテーブルに'Berkeley'の行ないよーってことかな。
試しにcitiesに'Berkeley'の行を入れてから実行してみると……
mydb=# INSERT INTO cities VALUES('Berkeley', point(10, 10)); INSERT 0 1 mydb=# INSERT INTO weather VALUES('Berkeley', 45, 53, 0.0, '1994-11-28'); INSERT 0 1
挿入できた!なるほどー。
3.4 トランザクション
トランザクションは複数の手順を単一の操作にまとめ上げること。エラーが発生した場合はトランザクションは完結しない。
他のトランザクションからはそのトランザクションが完結するまで不可視……ってのは終わるまで待ってるということなのか、同時に走ってる場合は実行前のデータで処理されるってことなのか……
ってかトランザクションってなんかモードみたいなのがあった気がする。
BEGIN; UPDATE accounts SET balance = balance - 100.00 WHERE name = 'Alice'; COMMIT;
BEGINでトランザクションを開始、COMMITで更新の完了をする。途中で問題があって更新の破棄をする場合はROLLBACKをする。
セーブポイントを使うと、トランザクション内の文をより細かい粒度で制御できるみたい。
mydb=# BEGIN; BEGIN mydb=# INSERT INTO cities VALUES('Niigata', point(20, 20)); INSERT 0 1 mydb=# SAVEPOINT insert_niigata; SAVEPOINT mydb=# INSERT INTO cities VALUES('Tokyo', point(30, 30)); INSERT 0 1 mydb=# ROLLBACK TO insert_niigata; ROLLBACK mydb=# COMMIT; COMMIT mydb=# SELECT * FROM cities; city | location ----------+---------- Berkeley | (10,10) Niigata | (20,20) (2 rows)
'Niigata'を挿入したあと、'Tokyo'を挿入してるけどROLLBACK TOで'Niigata'を挿入した直後に戻ってからCOMMITしているので'Tokyo'は挿入されてない。
こういう使い方するのかー、なるほど。
3.5 ウィンドウ関数
意味がわからない……あとで調べる。
3.6 継承
OOPと同じく、テーブルを継承するらしい。
mydb=# DROP TABLE weather; DROP TABLE mydb=# DROP TABLE cities; DROP TABLE mydb=# CREATE TABLE cities ( mydb(# name text, mydb(# population real, mydb(# altitude int mydb(# ); CREATE TABLE mydb=# CREATE TABLE capitals( mydb(# state char(2) mydb(# ) INHERITS (cities); CREATE TABLE mydb=# SELECT * FROM capitals; name | population | altitude | state ------+------------+----------+------- (0 rows)
citiesを継承したcapitalsはstate以外のカラムを持ってる。
mydb=# SELECT name, altitude FROM ONLY cities WHERE altitude > 500;
FROM ONLYにすることでcitiesテーブルだけを参照するみたい。ということはONLYを付けないと継承元も参照するってことなのかな。
あと、継承すると一意性制約もしくは外部キーが使えないみたい。
これで一応チュートリアルの一章から三章は終わり。
読み進めるのがいいのか、一応勉強してみたほうがいいのか……
ひと通り先に読んでみたほうがいいかな。
2013年04月28日(日)
はじめてのPostgreSQL 9.1.5文書 第一章〜第二章
そろそろRDBのひとつくらいちゃんと扱えるようになりたいなーと思い、日本PostgreSQLユーザ会のPostgreSQL文書を読もうかと。
HTML版がデザイン的にとてもシンプルなので若干の読みにくさがあるのですが、文章はとてもしっかりしてます。
PDF版もあるのでKindleとかに入れたらごろ寝して読めるからいいかも。
最新版は9.2だけど、UbuntuServerでaptから入れられるのが9.1なので9.1版のドキュメントを読むことにしました。
ちゃんと最後まで読み続けられるといいなー。
Ubuntuでaptからインストールすると、微妙にコマンドが違ったりするみたい。
Ubuntu で PostgreSQL を使ってみよう(続編) — Let’s Postgres
資料編:Ubuntu特有のPostgreSQL用コマンド — Let’s Postgres
ってかここもみた方が良いかも。PostgreSQL文書読んだら見てみよう。
環境:Ubuntu 日本語版 12.04 LTS 32bit on VirtualBox
1.1 インストール
PostgreSQLをインストールします。1.1から飛べる15章のところにはソースコードからインストールする方法が書いてあるのだけど、なんだかパッケージ推しのようなのでaptからインストールします。
$ sudo apt-get install postgresql
$ sudo apt-cache show postgresql | less
とすると9.1に依存してるのがわかるかと。つまり9.1が入るってことですねー。
ついでに
$ dpkg -l | grep postgresql
とかしても良いかも。
1.3 データベースの作成
createdbコマンドでDBを作成できるみたい。
$ which createdb /usr/bin/createdb $ createdb mydb createdb: could not connect to database postgres: FATAL: role "sasaplus1" does not exist
普通のユーザだと許可されてなくて作成できないみたい……
なのでpostgresユーザで実行してみる。
$ tail /etc/passwd
$ sudo passwd postgres
$ su - postgres
$ createdb mydb
できた!
DBの削除は以下で出来るみたい。
$ dropdb mydb
1.4 データベースへのアクセス
おなじみpsqlでDBへアクセスします。
$ createdb mydb $ psql mydb psql (9.1.9) Type "help" for help. mydb=# SELECT version(); version ------------------------------------------------------------------------------------------------------------ PostgreSQL 9.1.9 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit (1 row) mydb=# SELECT current_date; date ------------ 2013-04-25 (1 row) mydb=# SELECT 2 + 2; ?column? ---------- 4 (1 row)
version()やらcurrent_dateやら足し算をしてみたり。
あと\hで内部コマンドの表示、\?で他の内部コマンド、\qでpsqlの終了。
2.3 新しいテーブルの作成
新しいテーブルを作成するSQLを投げます。
mydb=# CREATE TABLE weather ( mydb(# city varchar(80), mydb(# temp_lo int, -- 最低気温 mydb(# temp_hi int, -- 最高気温 mydb(# prcp real, -- 降水量 mydb(# date date mydb(# ); CREATE TABLE
まあこれくらいは普通に書けてるかも。型を広く知らないけど。
セミコロンで終わるまでコマンドとして継続するものと認識することと、
空白、タブ、改行は自由に使えること、ハイフン2つで行コメントになるみたい。
mydb=# CREATE TABLE cities ( mydb(# name varchar(80), mydb(# location point mydb(# ); CREATE TABLE
point型はPostgreSQL独自のデータ型らしい……
他のRDBも使う事があるなら使わない方が良いのかも。
テーブルの削除は以下の通り。
mydb=# DROP TABLE weather; DROP TABLE mydb=# DROP TABLE cities; DROP TABLE
2.4 テーブルに行を挿入
基本的な挿入方法は以下のような感じ。
mydb=# INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');
まあ、大体は以下みたいにちゃんと指定するんじゃないかな。あと余計な箇所は省略したりとか。
mydb=# INSERT INTO weather (date, city, temp_hi, temp_lo) VALUES ('1994-11-29', 'Hayward', 54, 37);
あとCOPYというのを使うと平文のテキストファイルからロードできるみたい。
mydb=# COPY weather FROM '/home/user/weather.txt';
どういう形式なら大丈夫なんだろう?
って調べてみたらTSVとかCSVとかいろいろ指定できるみたい。
今まで十数万行のINSERT文のSQLファイル出力したりしてたけど、こっちのほうが速いみたいだしこっち使っていきたい。
2.5 テーブルへの問い合わせ
mydb=# SELECT * FROM weather;
全カラムを取得する。psqlからよく書いたりする。
mydb=# SELECT city, (temp_hi + temp_lo) / 2 AS temp_arg, date FROM weather;
任意の式を書いたり、ASでラベル付けしたり。
mydb=# SELECT * FROM weather WHERE city = 'San Francisco' AND prcp > 0.0;
WHEREで特定の条件に一致する行だけを取得したりとか。
mydb=# SELECT * FROM weather ORDER BY city, temp_lo;
ORDER BYで順番を並べ替えたりとか。
mydb=# SELECT DISTINCT city FROM weather;
DISTINCTで重複する行を表示しなくしたりとか。
2.6 テーブル間を結合
mydb=# SELECT * mydb-# FROM weather, cities mydb-# WHERE city = name;
FROMを複数指定した上で、cityとnameが一致する行だけを取得。
なんかこの辺に書いてある結合の意味がわからない…… 難しく考え過ぎなのかな。
この場合は*で指定できるけど、カラム名が重複する場合は列名を修飾する必要があるみたい。
mydb=# SELECT weather.city, cities.location FROM weather, cities WHERE weather.city = cities.name;
結合問い合わせっていうみたい。JOINを使わなくても結合問い合わせなのかー。
mydb=# SELECT * FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name);
これで左外部結合。よくわからん。右外部結合、完全外部結合もよくわからん……
結合についてよく調べた方が良いかも。
以下はラベル付けでの問い合わせ。
mydb=# SELECT * mydb-# FROM weather w, cities c mydb-# WHERE w.city = c.name;
2.7 集約関数
mydb=# SELECT max(temp_lo) FROM wather;
temp_loで一番値として高い行だけ取得。
集約関数はWHERE句には使えないので、そのような事をしたい場合は以下のような感じにする。
mydb=# SELECT city FROM weather mydb-# WHERE temp_lo = (SELECT max(temp_lo) FROM weather);
サブクエリを使うわけか。
GROUP BYで集約して、HAVINGで集約した行に対してフィルターをかけたり。
mydb=# SELECT city, max(temp_lo) mydb-# FROM weather mydb-# GROUP BY city mydb-# HAVING max(temp_lo) < 40;
まだよく意味をわかってないのでここも調べたいかも。
WHEREだと集約関数は使えないけど、HAVINGでは常に使う事になる、とある。
2.8 更新
普通にUPDATE文を。
mydb=# UPDATE weather mydb-# SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2 mydb-# WHERE date > '1994-11-28';
説明があまりないということは、特筆するような事がないってことなのかな?
2.9 削除
普通にDELETE文を。
mydb=# DELETE FROM weather WHERE city = 'Hayward';
WHERE付けないとえらいことになるので忘れずに。
とりあえずこんなところ?
復習しないといけないところがあるからちゃんと調べないとなー。
雑多なメモ
| \c | psql内で指定されたDBに接続する |
| \h | SQLのヘルプなどが見れる |
| \x | psqlでSELECTした時、カラムが行ごとに表示されるようになる |
| \? | 上記のコマンドなどが表示される |
\c
postgres=# \c test You are now connected to database "test" as user "sasaplus1". test=#
みたいな感じ。psqlを起動させるときにDBを指定しなくても\cで接続できる。
\h
postgres=# \h DROP DATABASE Command: DROP DATABASE Description: remove a database Syntax: DROP DATABASE [ IF EXISTS ] name
みたいな感じ。構文どうだったっけ?という時に見れる。
\x
postgres=# \x Expanded display is on. postgres=# SELECT version(); -[ RECORD 1 ]------------------------------------------------------------------------------------------------------- version | PostgreSQL 9.1.9 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit
みたいな感じ。カラムが行ごとに表示されるので、カラムが多い場合は見やすいかも。
ちょっとずつだけど、わかってきた気がする!
2013年04月26日(金)
pgvmを使ってみたよ
mysqlenvとかmysqlenvとかあるけど、PostgreSQLのないのかなーと思って探してみたらpgvmというものを見つけました。
PostgreSQLのバージョンを切り替えて使わなきゃならないほどPostgreSQL使えるわけじゃないのだけど、特定の場所にインストールしてくれるし、要らなくなったらディレクトリをまるごと削除すればよいだけなので、この手のものが好きだったりします。--prefixつけて./configureをすれば良いだけなのだけども‥‥
というわけでちょっと使ってみました。
環境:Ubuntu 12.04 LTS 64bit
インストール
インストールは
$ curl -s -L https://raw.github.com/guedes/pgvm/master/bin/pgvm-self-install | bash
でOKです。~/.bashrcにexport文が勝手に書き込まれるのはあまりよろしくないなあ……
インストールしたら
$ source $HOME/.bashrc
でパスが通ります。
使ってみる
とりあえずヘルプを表示させてみたり。
$ pgvm help Usage: pgvm action [arguments] - actions: install Installs a specific PostgreSQL version uninstall Uninstalls a specific PostgreSQL version list List all installed PostgreSQL versions use Choose an environment to use cluster Manipulate clusters (PGDATA directories) console Starts psql and connects to a specified cluster help This help
コンパイルしてみる
$ pgvm install 9 downloading 'http://ftp.postgresql.org/pub/source/v9.2.4/postgresql-9.2.4.tar.gz', please be patient... done. checking 'postgresql-9.2.4.tar.gz' integrity... done. extracting postgresql-9.2.4.tar.gz ... done. configuring PostgreSQL Version: 9.2.4 ... configure: error: readline library not found If you have readline already installed, see config.log for details on the failure. It is possible the compiler isn't looking in the proper directory. Use --without-readline to disable readline support. done. compiling ... ERRO: can not compile PostgreSQL 9.2.4, see make.error.log for details.
ありゃ…… 失敗した。
--without-readlineを付加してコンパイルするか、readlineのdevパッケージをインストールするかしないとダメみたい。
ここではlibreadline6-devをインストールすることに。
$ dpkg -l | grep readline ii libreadline6 6.2-8 GNU readline and history libraries, run-time libraries ii readline-common 6.2-8 GNU readline and history libraries, common files $ sudo apt-get install libreadline6-dev
もう一度コンパイル。
$ pgvm install 9 checking 'postgresql-9.2.4.tar.gz' integrity... done. extracting postgresql-9.2.4.tar.gz ... done. configuring PostgreSQL Version: 9.2.4 ... done. compiling ... done. installing ... done.
できた!
使ってみる
$ pgvm list
PostgreSQL Installed Version:
9.2.4
ちゃんとインストールされてるみたい。
$ psql --version プログラム 'psql' はまだインストールされていません。 次のように入力することでインストールできます: sudo apt-get install postgresql-client-common $ pgvm use 9.2.4 switched to 9.2.4 $ psql --version psql (PostgreSQL) 9.2.4
ちゃんと切り替えられてる。
クラスタを作ってみる
ただDB作りたいだけなんだけど、クラスタを作ってあげないとダメなみたい。クラスタ良くわかってない。
$ pgvm cluster create test initializing cluster in '/home/sasaplus1/.pgvm/clusters/9.2.4/test'... ok! $ pgvm cluster list cluster in current environment (9.2.4): test is offline at port 5433
testクラスタができたので起動してみる。
$ pgvm cluster start test starting cluster test@9.2.4 LOG: database system was shut down at 2013-04-26 22:35:56 JST LOG: database system is ready to accept connections LOG: autovacuum launcher started
これで起動したみたいなのでアクセスしてみる。
$ pgvm console test connecting to cluster 'test' on port '5433' ... psql (9.2.4) Type "help" for help. postgres=# \q
アクセスできた!いつものpsqlや!
止めるときは以下のようにするみたい。
$ pgvm cluster stop test stopping cluster test@9.2.4 LOG: received smart shutdown request LOG: autovacuum launcher shutting down LOG: shutting down LOG: database system is shut down
PostgreSQLのコンパイルにちょっとだけ時間がかかるけど、それ以外はとても良いかも。
ゆるふわPostgreSQLな感じで大変好みです。
参考:
Gerenciando múltiplas versões do PostgreSQL com pgvm - YouTube
2013年01月31日(木)
node-postgresのタイムアウト的な
node-postgresでPostgreSQLにアクセスしてレコードを出力するコードを書いたのだけど。
var pg = require('pg'); pg.connect('', function(err, client) { if (err) throw err; client.query('SELECT * FROM temp LIMIT 1', function(err, result) { if (err) throw err; console.dir(result.rows[0]); }); });
$ node index.js { id: 1, name: 'sasaplus1' } (しばらくプロンプトが戻って来ない)
タイムアウトの値がデフォルトだと30秒?に設定されてるらしくて戻って来ないみたい。
pg.defaults.poolIdleTimeout = 500;
とかにするとすぐに戻ってくる。
まあ、実際はこんなにタイムアウトを短くしないだろうし、pg.connectで受け取ったClientは内部で適当に管理してくれてるらしいし、client.end()呼ばないでそのまま他のコールバック呼んでいけば、いつの間にか切断されてる、って感じになるのかな。

