在 Esqueleto 中更新具有特定 ID 的行

Posted

技术标签:

【中文标题】在 Esqueleto 中更新具有特定 ID 的行【英文标题】:Update a row with specific ID in Esqueleto 【发布时间】:2017-10-03 19:25:20 【问题描述】:

我可以像这样在 Esqueleto 中使用 entryId 更改一行的字段:

  update $ \entry -> do
    set entry [ EntryFoo =. val bar ]
    where_ (entry ^. EntryId ==. val entryId)

但是,一直写它会很烦人。我希望能够写出这样的东西:

  updateById entryId $ \entry ->
    set entry [ EntryFoo =. val bar ]

我尝试自己编写此助手,但发现我不知道如何以通用方式编写^. EntryId(即适用于任何条目类型的方式)。是否可以?还是我遗漏了什么,updateById 已经存在于 Esqueleto 中?

【问题讨论】:

【参考方案1】:

我绝对不是 esqueleto 方面的专家,但我猜:

updateById entryId upd = update $ \entry -> do
                           upd entry
                           where_ (entry ^. EntryId ==. val entryId)

应该能解决问题。

【讨论】:

当然,它解决了一个特定表 (Entry) 的问题,但我想要一个适用于任何表的解决方案。 IE。我需要updateById :: Key a -> _ -> _,而你的功能是updateById :: Key Entry -> _ -> _【参考方案2】:

对于任何Entity^. EntityId 可以写成^. persistIdFieldpersistIdField 字段是PersistEntity 类的方法)。因此,您的函数可以这样编写:

updateById
  :: (E.PersistEntityBackend val ~ E.SqlBackend,
      MonadIO m, E.PersistEntity val)
  => Key val
  -> (E.SqlExpr (E.Entity val) -> E.SqlQuery a)
  -> E.SqlWriteT m ()
updateById entryId upd = E.update $ \entry -> do
  upd entry
  E.where_ (entry E.^. E.persistIdField ==. E.val entryId)

【讨论】:

以上是关于在 Esqueleto 中更新具有特定 ID 的行的主要内容,如果未能解决你的问题,请参考以下文章

在 esqueleto 中加入视图

获取具有特定数量的重复值的行

从表中选择行,其中具有相同 id 的另一个表中的行在另一列中具有特定值

聚合具有特定值的两行之间的行

选择具有最大 ID 和特定条件的行

sql 插入具有特定主ID的行