apt-get install libghc6-haskelldb-dev
関連パッケージがもさもさっとインストールされる。
やたら沢山ある。
使い方はこの辺
HaskellDB
使い方
テーブル定義の作成
まずはテーブル定義ファイルを作成する。
module DBSpec where
import Database.HaskellDB.DBSpec
import Database.HaskellDB.FieldType
import Database.HaskellDB.DBSpec.DBSpecToDBDirect
dbInfo = DBInfo {
dbname = "username",
opts = DBOptions {useBString = False},
tbls = [myTable]
}
myTable = makeTInfo "tablename" [tRow1, tRow2]
tRow1 = makeCInfo "column1" (StringT, True)
tRow2 = makeCInfo "column2" (StringT, True)
createDBInfo = dbInfoToModuleFiles "" "DBInfo" dbInfoだいたい見ての通り。
DBOptionsはよく分からない・・。
(StringT, True)のTrueは、nullが含まれるかどうか。
これをTrueにすると、値はMaybe型で返ってくる。
そして
import DBSpec main = createDBInfo
でテーブル定義ファイルを作成する。
これを実行すると自動的に(上の例では)DBInfo/Tablename.hs が生成される。
DBの利用
import Database.HaskellDB
import Database.HaskellDB.GenericConnect
import DBInfo.Tablename
dbDriver = "postgresql"
dbServer = "localhost"
dbDatabase = "dbname"
dbPassword = ""
dbUsername = "username"
withDB q = genericConnect dbDriver [dbServer,dbDatabase,dbPassword,dbUsername]
(printAndPerformQuery q)
printAndPerformQuery q db =
do putStrLn "Query:"
print q
result <- query db q
putStrLn "Results:"
mapM_ print result
selectAllFromMyTable = table tablename
main = withDB selectAllFromMyTable取り敢えず例題をそのままコピってみた。
型を細かく見てみると
main = mapM_ print =<< getAllData
getAllData = conn tableDataQuery
conn :: (Database -> IO a) -> IO a
conn f = genericConnect dbDriver
[dbServer,dbDatabase,dbPassword,dbUsername] f
--tableDataQuery :: Database -> IO a
tableDataQuery db = query db (table tablename)このようになる。
tableDataQueryの戻り値はIO [Record ...]になる。細かい定義は makeTInfo で作ったファイルに基づく。
細かいデータベース処理は隠蔽されているので、queryに渡す関数を定義していくことになるのかな。
main = mapM_ print =<< getAllData
--
-- データベースクエリ関数
--
getAllData = genericQuery getAllDataQuery
getAllDataQuery = table tablename
--
-- 汎用操作
--
genericQuery = conn . result
conn :: (Database -> IO a) -> IO a
conn = genericConnect dbDriver
[dbServer,dbDatabase,dbPassword,dbUsername]
result f db = query db fこんな感じで。