Hatena::ブログ(Diary)

四角革命前夜

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を導入してみた - コロタエンヂニアリング

cannot open shared object fileの対処 - ksauzz weblog

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文書を読もうかと。

PostgreSQL 9.1.5文書

HTML版がデザイン的にとてもシンプルなので若干の読みにくさがあるのですが、文章はとてもしっかりしてます。

PDF版もあるのでKindleとかに入れたらごろ寝して読めるからいいかも。


最新版は9.2だけど、UbuntuServerでaptから入れられるのが9.1なので9.1版のドキュメントを読むことにしました。

ちゃんと最後まで読み続けられるといいなー。


Ubuntuでaptからインストールすると、微妙にコマンドが違ったりするみたい。

Ubuntu で PostgreSQL を使ってみよう(続編) — Let’s Postgres

資料編:Ubuntu特有のPostgreSQL用コマンド — Let’s Postgres


ってかここもみた方が良いかも。PostgreSQL文書読んだら見てみよう。

ホーム — Let’s Postgres


環境: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

createdb

dropdb


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の終了。

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付けないとえらいことになるので忘れずに。


とりあえずこんなところ?

復習しないといけないところがあるからちゃんと調べないとなー。

雑多なメモ

\cpsql内で指定されたDBに接続する
\hSQLのヘルプなどが見れる
\xpsqlで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な感じで大変好みです。


参考:

guedes/pgvm ? GitHub

Gerenciando múltiplas versões do PostgreSQL com pgvm - YouTube

D

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()呼ばないでそのまま他のコールバック呼んでいけば、いつの間にか切断されてる、って感じになるのかな。