2012-12-25 52 views
3

假設我有這樣的代碼(來自"Synopsis"簡體)插入列表到數據庫持久

{-# LANGUAGE QuasiQuotes, TemplateHaskell, TypeFamilies, OverloadedStrings #-} 
{-# LANGUAGE GADTs, FlexibleContexts #-} 
import Database.Persist 
import Database.Persist.Sqlite 
import Database.Persist.TH 
import Control.Monad.IO.Class (liftIO) 
import Control.Monad.Trans.Resource (runResourceT) 

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist| 
Person 
    name String 
|] 

main :: IO() 
main = runResourceT $ withSqliteConn ":memory:" $ runSqlConn $ do 
    runMigration migrateAll 

    johnID <- insert $ Person "John Doe" 
    janeID <- insert $ Person "Jane Doe" 

    liftIO $ print johnID 
    liftIO $ print janeID 

    return() 

input = [Person "John Doe", Person "Jane Doe"] 

我將如何插入列表input,進而獲得ID列表?

回答

3

可以使用forM功能爲runSqlConn塊。例如:

main :: IO() 
main = runResourceT $ withSqliteConn ":memory:" $ runSqlConn $ do 
    runMigration migrateAll 

    ids <- forM input insert 
    liftIO $ print ids 

    where 
    input = [Person "John Doe", Person "Jane Doe"] 
+1

或更多haskellish,'mapM insert input'。我知道RWH有一個討論爲什麼會有兩種'mapM'和'forM'。 – Tarrasch

+0

嗯,作品。嘗試之前,它噴出了奇怪的錯誤信息。謝謝。 – Secoe