我是Haskell和Yesod的新手,我正在尝试构建一个可以从外部API回答查询的简单Web应用程序。我已经构建了一个解析器(使用Parsec),它获取了我想要作为常规Int值加载的实体的ID。
但是,对于我的生活,我无法弄清楚如何将这个Int变成get
将接受的东西(即Key
(?))。文档中的所有示例仅从先前插入或从url dispatch获取id。
任何帮助都会非常感激,因为我似乎被卡住了...... :)
答案 0 :(得分:28)
即使答案已经在评论中找到,我想举一个完整的例子。
假设我们有一个Person
模型,以下函数返回具有给定ID的persion记录(如果存在):
import Database.Persist.Types (PersistValue(PersistInt64))
getByIntId :: Integral i => i -> Handler (Maybe Person)
getByIntId i = runDB $ get $ Key $ PersistInt64 (fromIntegral i)
需要import
来构造整数的persist-version。 fromIntegral
会将任何整数转换为预期的类型Int64
。
更新:由于Yesod 1.2 PersistValue
位于模块Database.Persist.Types
中,因此在1.2之前它是Database.Persist.Store
(API Documentation)。
更新2 :由于Persistent 2.0.2有两个内置函数可以从/向数据库键转换:toSqlKey
和fromSqlKey
(API Documentation ,请参阅answer by hhefesto以获取示例。)
答案 1 :(得分:5)
PersistInt64
在这里:Database.Persist.Types
。
以前PersistInt64
在这里:Database.Persist.Store
。
答案 2 :(得分:2)
仅举例说明如何使用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