如何使用Persistent获取数据库实体的id?

rub*_*oor 5 sql haskell persistent

我有一个数据库模型,使用像这样的Persistent

import           Database.Persist.TH (mkPersist, persistUpperCase,
                                  share, sqlSettings)

share [mkPersist sqlSettings] [persistUpperCase|
Foo
    field1 Int
    field2 Bool
|]
Run Code Online (Sandbox Code Playgroud)

我可以foo :: Foo从数据库中获取一个对象.我可以用fooField1 foo :: Int和访问字段fooField2 foo :: Bool.因为我使用sqlSettings,我知道存在Int64与每个实体存储的"id"的数据库密钥的代表.比如我用的时候get . toSqlKey :: Int64 -> ...

鉴于我foo :: Foo,我怎么得到id :: Int64

JP *_*mau 5

A Foo本身没有id,因为它Foos可以存在于数据库之外(在它们被写入之前).这就是为什么选择操作会给你一个实体列表,它包含密钥和对象.

http://hackage.haskell.org/package/persistent-2.2/docs/Database-Persist-Types.html#t:Entity

例如,有关从主键约束获取的yesod书(http://www.yesodweb.com/book/persistent):

personId <- insert $ Person "Michael" "Snoyman" 26
maybePerson <- getBy $ PersonName "Michael" "Snoyman"
case maybePerson of
    Nothing -> liftIO $ putStrLn "Just kidding, not really there"
    Just (Entity personId person) -> liftIO $ print person
Run Code Online (Sandbox Code Playgroud)

getBy的返回类型是包含key(personId)和value(person)的Entity .

  • 为了完整起见:`fromSqlKey.entityKey :: Entity record - >从数据库中检索的实体上的Int64`(例如`Entity foo`)给出了id. (3认同)