我有一个带有 autoInc 主表的表,key('id')
但我还需要通过另一列(列“代码”)控制表中记录的唯一性。
我试图这样做:
def findByCode(code: String): Future[Option[A]] =
try db.run(tableQuery.filter(_.code === code).result.headOption)
def insert(entity: A): Future[Int] =
try db.run(tableQuery += entity)
def insertIfNotExists(code: String, entity: A): Future[Int] = {
findByCode(code).flatMap {
case None => insert(entity)
case _ => Future(-1)
}
}
方法findByCode
和插入分别返回Future[A]
和Future[Int]
。当我在要插入的一些记录上运行此代码时,我意识到findByCode
没有找到已插入的记录并且我得到了大量的记录重复。作为一种解决方法,我在我的数据库中建立了一个约束(由 postgres 驱动),但我想知道我是否在代码中做错了,或者当我刚刚插入时,可能无法保证检查记录是否存在另一个并发事务?
什么是我的目的的最佳推荐方式?
1)建立唯一性约束并包装插入int尝试块?(我现在用这个)
2)使用带有一个查询的plainsql实现insertOrUpdate(插入不存在的位置(选择位置...))
3) 为此类查询编写一个同步包装器(使用 Await)并在一个线程中同步运行它们
4) 其他
提前感谢您的任何建议。