Haskell で sqlite3 のデータベースにアクセスしてクエリを実行してみるまで。
GHC のインストールは以前ここに書いた。
http://basicwerk.com/blog/archives/1131
その他必要な物がいろいろある。
The text package
http://hackage.haskell.org/package/text
The convertible package
http://hackage.haskell.org/package/convertible
The utf8-string package
http://hackage.haskell.org/package/utf8-string
上記をインストールした上で、
The HDBC package
http://hackage.haskell.org/package/HDBC
Sqlite v3 driver for HDBC
http://github.com/hdbc/hdbc-sqlite3
全てパッケージのインストール方法は共通で、
- それぞれの Web ページから zip か tar.gz ファイルをダウンロードしてローカルの適当な場所に展開する
% tar -zxvf filename.tar.gz
GitHub の場合は、「HTTPS clone URL」と書いてある URL をコピって
% git clone https://github.com/hdbc/hdbc-sqlite3.git
- 展開後のディレクトリに cd
% ghc --make -o setup Setup.lhs (または Setup.hs)
でコンパイル% ./setup configure
でインストール可能か確認。必要なパッケージ等がないとこの時点で怒られる% ./setup build
% sudo ./setup install
致命的なエラーがなければこれでパッケージのインストールは完了。
では本題のデータベース接続。
こちらのサイトを参考にさせてもらった。
HaskellでSQLiteにアクセスする
まず DB を作る。
% sqlite3 sample.db "create table sample (id, val);" % sqlite3 sample.db "insert into sample values (1, 'aaa'), (2, 'bbb'), (3, 'ccc');" % sqlite3 sample.db "select * from sample;" 1|aaa 2|bbb 3|ccc
Haskell ファイルの中身はこんな感じ(DB と同じディレクトリに作成してコンパイル)。
sql_test.hs
import Database.HDBC import Database.HDBC.Sqlite3 import Data.Maybe main = do conn <- connectSqlite3 "sample.db" stmt <- prepare conn "select * from sample;" execute stmt [] results <- sFetchAllRows stmt mapM_ print results
コンパイルする。
% ghc --make sql_test.hs [1 of 1] Compiling Main ( sql_test.hs, sql_test.o ) Linking sql_test ...
コンパイルが終わると sql_test という名前の実行ファイルができる。
% sql_test [Just "1",Just "aaa"] [Just "2",Just "bbb"] [Just "3",Just "ccc"]