繁体   English   中英

持续更新无法编译

[英]Persistent upsert does not compile

我正在尝试使用PostgreSQL在Persistent中做一些看起来很简单的操作:给定一个Attendance记录列表,用相同的唯一键覆盖任何现有行,或者如果不存在则插入。 类型如下:

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 upsert文档对我来说似乎有些模糊:如果记录存在并且我将更新保留为空白,则我知道它将保留实体。 但这并不等同于repsert的行为,是吗? 它也没有说不存在唯一性约束时会发生什么。

我试过的是

runDb (mapM_ ups atts)
 where 
  -- ups rec = upsert rec [AttendanceAttending =. True] also doesn't work
  ups rec = upsert rec [AttendanceAttending =. (attendanceAttending rec)]

但这会导致我不太了解的错误:

• 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 ((=.)) ,因此它应该是持久的。

令人尴尬的是,这实际上就像添加{-# LANGUAGE TypeFamilies #-}一样简单。 我之所以没有这样做,是因为我误读了错误消息,而我的其他模块都不需要该扩展名。 谢谢,费奥多!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM