【问题标题】:Haskell persistent w/ esqueleto: read entire table, and count recordsHaskell persistent w/ esqueleto:读取整个表,并计算记录
【发布时间】:2015-08-29 06:48:01
【问题描述】:

我有以下架构:

share [ mkPersist sqlSettings, mkMigrate "migrateAll" ] [persistLowerCase|
AdminChan
  timestamp T.Text
  name      T.Text
  msg       T.Text
BanHost
  timestamp T.Text
  host      T.Text
  isBanned  Bool
  reason    T.Text
|]

现在说我想以[AdminChan] 的形式获取admin_chan 表中的所有记录。我怎样才能做到这一点?我有这个功能:

dumpDbTbl :: SqlPersistT IO [AdminChan]
dumpDbTbl = map entityVal <$> (select . from $ return)

1) 但是如何从SqlPersistT IO 堆栈中取出[AdminChan]? (请注意,我没有使用yesod。)

2) 另外,是否可以重写上述函数,使其成为多态并且还可以与BanHost 表一起使用?

3) 如何使用esqueleto 编写一个函数来返回表中的记录数?

谢谢!

【问题讨论】:

    标签: database haskell esqueleto


    【解决方案1】:
    1. 您使用runSqlPersistMrunSqlPersistMPool 之类的函数在IO monad 中评估您的查询。例如:

      dumpDbTbl :: (MonadIO m) => SqlPersistT m [AdminChan]
      dumpDbTbl = map entityVal <$> (select . from $ return)
      
      main :: IO ()
      main = runStderrLoggingT $ withSqlitePool ":memory:" 4 $ \pool -> liftIO $ do
          flip runSqlPersistMPool pool $ do
              runMigration migrateAll
      
              admins <- dumpDbTbl
      
              liftIO $ print (admins :: [AdminChan])
      
    2. 是的,你可以,但你必须包括一些额外的限制:

      dumpDbTbl :: (PersistEntity b, MonadIO m,
                    PersistEntityBackend b ~ SqlBackend) => SqlPersistT m [b]
      dumpDbTbl = map entityVal <$> (select . from $ return)
      
    3. 您使用 esqueleto 函数countRows

      countHostBans :: (MonadIO m) => SqlPersistT m [(T.Text, Int)]
      countHostBans =
          map (\(Value v, Value c) -> (v, c)) <$> (select $ from $ \banHost -> do
              let c = countRows
              groupBy (banHost ^. BanHostHost)
              return (banHost ^. BanHostHost, c))
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-13
      • 1970-01-01
      • 2018-10-13
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多