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