36

私はHaskellとYesodの両方に不慣れで、外部APIからのクエリに応答できる単純なWebアプリケーションを構築しようとしています。(Parsecを使用して)パーサーを作成しました。これにより、通常のInt値としてロードするエンティティのIDが取得されます。

しかし、私は一生の間、このIntをget受け入れるもの(つまりKey(?))に変換する方法を理解できません。ドキュメントのすべての例は、以前の挿入またはURLディスパッチからのみIDを取得します。

私は立ち往生しているようですので、どんな助けでも大歓迎です... :)

4

3 に答える 3

28

コメントですでに答えが見つかったとしても、完全な例を挙げたいと思います。

モデルがあるとすると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.StoreAPIドキュメント)。

アップデート2:Persistent 2.0.2以降、データベースキーとの間で変換する2つの組み込み関数があります:toSqlKeyおよびfromSqlKeyAPIドキュメント、例についてはhhefestoによる回答を参照してください)。

于 2013-01-17T14:15:38.213 に答える
5

PersistInt64ここにあります:Database.Persist.Types

以前PersistInt64はここにありました:Database.Persist.Store

于 2012-11-25T13:43:12.440 に答える
3

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
于 2016-03-03T19:26:03.920 に答える