首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Persistent upsert无法编译

Persistent upsert无法编译
EN

Stack Overflow用户
提问于 2018-01-20 07:17:53
回答 1查看 97关注 0票数 0

我试图用PostgreSQL在Persistent中做一些看起来很简单的事情:给定一个Attendance记录列表,用相同的惟一键覆盖任何现有的行,如果它们不存在,则插入它们。以下是这些类型:

代码语言:javascript
运行
复制
share [mkPersist sqlSettings, mkDeleteCascade sqlSettings, mkMigrate "migrateAllEvents"] [persistLowerCase|
Event json sql=events
    description Text
    date UTCTime
    UniqueEvent date
Attendance json
    attending Bool
    eventId EventId
    user UserId
    UniqueAttendance eventId user
|]

我没有钥匙,所以我不能使用repsert,但我认为upsert是我需要的。documentation for upsert对我来说看起来有点模糊:如果记录存在,而我将更新保留为空,我知道它将保留实体的原样。但这并不等同于repsert声称的行为,不是吗?它也没有说明当不存在唯一性约束时会发生什么。

我尝试的是

代码语言:javascript
运行
复制
runDb (mapM_ ups atts)
 where 
  -- ups rec = upsert rec [AttendanceAttending =. True] also doesn't work
  ups rec = upsert rec [AttendanceAttending =. (attendanceAttending rec)]

但这导致了一个我不太理解的错误:

代码语言:javascript
运行
复制
• Illegal equational constraint BaseBackend backend ~ SqlBackend
  (Use GADTs or TypeFamilies to permit this)
• When checking the inferred type
    ups :: forall (m :: * -> *) backend.
           (BaseBackend backend ~ SqlBackend, PersistUniqueWrite backend,
            MonadIO m) =>
           Attendance -> ReaderT backend m (Entity Attendance)

你知道是什么导致了这个错误吗?upsertBy也是一样的。我在同一个文件中导入了Esqueleto,但是是hiding ((=.)),所以它应该是纯持久化的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-20 18:45:35

令人尴尬的是,它真的和添加{-# LANGUAGE TypeFamilies #-}一样简单。我没有尝试过,因为我误读了错误消息,而我的其他模块都不需要那个扩展。谢谢,Fyodor!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48350898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档