Haskell 使用持久化方法输入与数据库的关系

Haskell 使用持久化方法输入与数据库的关系,haskell,yesod,persistent,Haskell,Yesod,Persistent,从Haskell和Yesod开始,也许Yesod相对于Haskell来说有些过分:) 我使用持久化via构建实体 share [mkPersist sqlSettings, mkMigrate "migrateAll"][persistLowerCase| Game title String company String UniqueTitle title deriving Show Tag label String description String Maybe

从Haskell和Yesod开始,也许Yesod相对于Haskell来说有些过分:)

我使用持久化via构建实体

share [mkPersist sqlSettings, mkMigrate "migrateAll"][persistLowerCase|
Game
  title String
  company String
  UniqueTitle title
  deriving Show
Tag
  label String
  description String Maybe
  UniqueLabel label
  deriving Show
GameTag
  gameId GameId
  tagId TagId
  UniqueGameTag gameId tagId
|]

-- Yesod related code ...
大体上我有

main :: IO ()
main = do
let taggings = fromFile :: [(Game, Tag)] -- fromFile code not included
runStderrLoggingT $ withSqlitePool ":inmemory:" 10 $ λpool →  liftIO $ do
runResourceT $ flip runSqlPool pool $ do
  runMigration migrateAll
  let (g, t) = head taggings
  gid ←  insert g
  tid ←  insert t
  insert (GameTag gid tid)
warp 3000 $ App pool
这样做,我将第一个关系放入数据库,通过从列表中选择元素,我可以“手动”添加更多的元素,但我无法通过某种方式迭代
标记来找出如何将所有关系放入数据库。如何定义一个可以映射到
taggings::[(Game,Tag)]
的函数,并插入
GameTag
类型的游戏标签
通过持久化?

这里的主要技巧不是拉出函数,这很容易:

f (g, t) = do
  gid <- insert g
  tid <- insert t
  insert (GameTag gid tid)

这里有两种从main中实际运行操作的方法

sequence (map f taggings) --sequentially runs the actions in the list
或者,更具可读性

forM taggings f
或者,更详细一点

forM taggings $ \tagging -> do
  f tagging
您可能还需要查看
mapM
。还应了解
forM_
sequence_
以抑制(通常是无用的)返回值

forM taggings $ \tagging -> do
  f tagging