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さんも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接続をしようとして挫折しています。
今回ようやくこのトラウマを克服!三十路をとうの昔に通り越したけど、まだ成長出来ているという実感を得ました。
うれしいです。