[英]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.