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

时间:2015-07-03 15:17:16

标签: sql haskell persistent

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

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

share [mkPersist sqlSettings] [persistUpperCase|
Foo
    field1 Int
    field2 Bool
|]

我可以从数据库中获取对象foo :: Foo。我可以使用fooField1 foo :: IntfooField2 foo :: Bool访问字段。因为我使用sqlSettings,我知道有一个Int64 - 表示数据库键,每个实体都存储“id”。例如。当我使用get . toSqlKey :: Int64 -> ...

鉴于我的foo :: Foo,如何获取id :: Int64

1 个答案:

答案 0 :(得分:5)

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

getBy的返回类型是包含密钥(personId)和值(person)的实体。