VisualWorksでPostgresに接続する
忘れたころに槍玉に挙げられる例の言語をやらされることになった。CVSクライアントとしてしか使わないのにeclipseまで入れることになるし(ごった煮でよくね?)、当然JDKまで必要になる。ふざけんなと思ったけど、これはこれでScalaに生かそう。
そんなおまけはともかくPostgresをインストールしたので早速いつものようにやってみる。pgAdminのGUI上でテーブルを作成しようとしたらvarcharが選択できなかった(pgAdmin1.6.3/Postgres8.2.3)んでtextにしたけど、最近はそうなのか?8.1.*を入れてある人がいたので聞いてみたけど、そちらではvarcharの選択もできてた。
VisualWorksの場合、準備は必要なし?インストールオプション覚えてないから分からないけど、最初にインストールしたときにPostgresパッケージもインストールしたかもしれない。ということは、入ってなければ追加インストールが必要かも。
用意したデータはSQLiteのときとほぼ一緒。nameの型がstringでは通らないのでtextにして、PKを追加した。
create table aa ( id integer primary key, name text ); insert into aa values (0, 'foo'); insert into aa values (1, 'bar');
あとは普通にやっちゃう。
| sql params con ret | sql := 'select * from aa'. params := ConnectionParameterSet new host: 'localhost'; databaseName: 'squeak_test'; port: 5432; userName: 'postgres'; password: 'postgres'. [ con := PostgreSQLConnection using: params. ret := con executeQuery: sql. ] on: Exception do: [ :e | Transcript show: e printString; cr. ]. con notNil ifTrue: [con close]. Transcript clear. ret first rows do: [ :each | "Transcript show: each printString; cr" Transcript show: (each fields at: 1); show: (each fields at: 2); cr ]
ただ、どうにも「らしくない」感じのコードだと思う。フォーマットの問題もないとは言わないけど、なんだろうこの感じ。PostgreSQLConnection>>executeQuery:の戻り値もやたらとややこしいし、例によって違ってるかも。
まとめ
BlockClosure>>ensure:はtry-finallyだったけど、BlockClosure>>on:do:はtry-catch。
Postgresのvarchar(n)が、character varying(n)とかになった?