基于条件的光滑3.0更新行

时间:2017-01-27 05:13:30

标签: scala slick

我有以下方法实际更新数据库行对表。它首先检查条目是否存在具有特定条件,并且仅当条目存在时才更新相应的行。因此,有效地,对数据库进行了两次调用。我想避免将两个调用发送到数据库。所以这是代码:

  def confirmUserRegistration(hash: String) = async {
    val query = UserRegistrationTable.registrationForHash(hash)
    val isRowAvailable = await(database.run(query.result.headOption))
    if (isRowAvailable.isDefined) {
      // do the update
    } else {
    // do nothing and return
    }
  }

UserRegistrationTable.registrationForHash(哈希)查询如下所示:

  object UserRegistrationTable {

    val all = TableQuery[UserRegistrationTable]

    val registrationForHash = (hash: String) => {
      all.filter(_.registrationHash === hash)
    }
  }

那么如何优化我的服务才能只发出一次数据库调用?

编辑:更新了以下帖子给出的反馈:

以下是我的方法的外观:

  def confirmUserRegistration(hash: String) = async {
    val query = {
      UserRegistrationTable.registrationForHash(hash)
        .map(_.hasUserConfirmed)
        .update(true)
    }

    val isUpdated: Int = await(database.run(query))

  }

1 个答案:

答案 0 :(得分:1)

只需使用以下更新:

val updateOperation: DBIO[Int] = all
    .filter(_.registrationHash === hash)
    .map(u => (u.field1, u.field2, u.field3))
    .update((newValue1, newValue2, newValue3))

请注意,上面的updateResultDBIO,其中包含Int - 更新的行数。

所以你可以这样做:

db.run(updateOperation).map { updatedRows =>
     if(updatedRows >= 0) {
         // at least one row was affected, return something here
     } else {
         // nothing got updated, return something here
     }
}

如果您想要更新整行,您可以使用您的案例类,但我怀疑这是您想要的:

val userRegistration: UserRegistrationCaseClass = ...

val updateOperation: DBIO[Int] = all
    .filter(_.registrationHash === hash)
    .update(newUserRegistration)