2

我有一个带有 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) 其他

提前感谢您的任何建议。

4

0 回答 0