Yesod:从Int中通过ID获取数据库实体
我是Haskell和Yesod的新手,正在尝试构build一个简单的Web应用程序,可以从外部API回答查询。 我已经构build了一个parsing器(使用Parsec),这使得我想要加载一个实体的ID作为一个常规的Int值。
然而,我终身无法弄清楚如何把这个Int变成一个可以接受的东西(即一个Key
(?))。 文档中的所有示例只能获得以前插入的id,或从url派发。
任何帮助将不胜感激,因为我似乎被卡住… 🙂
即使答案已经可以在评论中find,我想举一个完整的例子。
假设我们有一个Person
模型,下面的函数返回给定ID(如果存在)的persion的logging:
import Database.Persist.Types (PersistValue(PersistInt64)) getByIntId :: Integral i => i -> Handler (Maybe Person) getByIntId i = runDB $ get $ Key $ PersistInt64 (fromIntegral i)
import
是需要让我们构造一个整数的持久版本。 fromIntegral
将任何整数转换为预期的typesInt64
。
更新 :由于Yesod 1.2 PersistValue
存在于模块Database.Persist.Types
,因此在1.2之前它是Database.Persist.Store
( API文档 )。
更新2 :由于持久2.0.2有两个内置函数来转换/数据库键: toSqlKey
和fromSqlKey
( API文档 )。
PersistInt64
在这里: Database.Persist.Types
。
以前PersistInt64
在这里: Database.Persist.Store
。
只是一个如何使用toSqlKey(Persistent 2.0.2)
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| Users email String password String alias String deriving Show |] connStr = "host=localhost dbname=communis_db user=communis password=develpass port=5432" inBackend :: ReaderT SqlBackend (NoLoggingT (ResourceT IO)) a-> IO a inBackend action = runStderrLoggingT $ withPostgresqlPool connStr 10 $ \pool -> liftIO $ do flip runSqlPersistMPool pool $ do runMigration migrateAll action toUserId :: Int64 -> UsersId toUserId = toSqlKey get_user :: Int64 -> IO (Maybe Users) get_user = inBackend . get . toUserId delete_user :: Int64 -> IO () delete_user = inBackend . delete . toUserId