2015-07-03 90 views
5

我有一个数据库模型,使用持久像这样如何获得持久性的数据库实体的ID?

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

回答

5

A Foo本身没有ID,因为Foos可以在数据库之外存在(在写入之前)。这就是为什么一个选择操作会给你一个包含键和对象的实体列表。

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

例如,参见耶索德书(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)。

+0

如果我不使用'getBy',但例如一个esqueleto查询,我通常使用'entityVal'并删除ID ...我只是没有注意到。 –

+3

为了完整起见:'fromSqlKey。 entityKey :: Entity record - > Int64'在从数据库中检索的实体(例如'Entity foo')中给出id。 –