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

Posted

技术标签:

【中文标题】如何使用 Persistent 获取数据库实体的 id?【英文标题】:How to get the id of a database entity with Persistent? 【发布时间】:2015-07-03 15:17:16 【问题描述】:

我有一个数据库模型,像这样使用 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】:

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) 的实体。

【讨论】:

如果我不使用 getBy 但例如esqueleto 查询,我通常使用 entityVal 并删除 id ...我只是没有注意到。 为了完整起见:fromSqlKey . entityKey :: Entity record -&gt; Int64 从数据库中检索到的实体(例如Entity foo)给出了 id。

以上是关于如何使用 Persistent 获取数据库实体的 id?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 yesod-persistent 识别我的 aeson 解析实体数组的类型?

Yesod/Persistent 实体派生 Show

使用 Persistent 输入与数据库的关系

Haskell Persistent Library - 如何从我的数据库中获取数据到我的前端?

Cassandra 实体必须具有@Table、@Persistent 或@PrimaryKeyClass 注解

-Mapping persistent classes-003映射实体时的可选操作(<delimited-identif