HDBC-postgresqlが動いた

PostgreSQLを+universalでインストールし、x86_64とi386の両方に対応させたのが前回まで。
ちなみにGHCのライブラリのアーキテクチャを調べると、i386だったことが判明しました。

file /Library/Frameworks/GHC.framework/Versions/7.0.3-i386/usr/lib/ghc-7.0.3/ghc
/Library/Frameworks/GHC.framework/Versions/7.0.3-i386/usr/lib/ghc-7.0.3/ghc: Mach-O executable i386

PostgreSQLのライブラリのロードに失敗するそもそもの原因はこれだったのでしょう。

先人に倣う

「can't load .so/.DLL for: pq (dlopen(libpq.dylib, 9): image not found)」をGoogleで検索したところ、全く同じ問題に出会った人を発見しました。

Hendricks Solutions Blog

HendricksさんもPostgreSQLを+universal付きでインストールしていますが、結局それだけではダメだったようで最終的には「libpq.5.2.dylib」というファイルを「/usr/local/lib/libpq.dylib」にリンクしています。
無理矢理適合するライブラリをGHCに読み込ませる感じなのかな?なんだか影響が大きそうな方法ですが、まずはやってみましょう。

シンボリックリンクをはる

HendricksさんとはPostgreSQLのインストール先がちがうため、以下のようなコマンドになります。

sudo ln -s /opt/local/lib/postgresql84/libpq.5.2.dylib libpq.dylib

これでリンクがはれました。

ghciでPostgreSQLに接続してみる

ghciを起動してコマンドを打ち込んでみましょう。
connectPostgreSQL関数でConnectionを得て、あとはHDBCの提供する関数を使えばPostgreSQLを操作することが出来るようです。
connectPostgreSQL関数の引数には接続文字列を指定するようです。接続文字列の書式はこちらに書いてありました。

さあ、接続してみます。

Prelude> :m Database.HDBC Database.HDBC.PostgreSQL 
Prelude Database.HDBC Database.HDBC.PostgreSQL> connectPostgreSQL "host='****' dbname='****' user='***' password='***'" >>= getTables
(中略)
["TABLE1","TABLE2"]

・・・・やったぁぁぁぁぁっ!!!
ついにやりました。
PostgreSQLに接続成功です!!!

やっとスタート地点に立てました。

成長を実感する

過去に何度も、HaskellでDB接続をしようとして挫折しています。
今回ようやくこのトラウマを克服!三十路をとうの昔に通り越したけど、まだ成長出来ているという実感を得ました。
うれしいです。