我有以下方法实际更新数据库行对表。它首先检查条目是否存在具有特定条件,并且仅当条目存在时才更新相应的行。因此,有效地,对数据库进行了两次调用。我想避免将两个调用发送到数据库。所以这是代码:
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))
}
答案 0 :(得分:1)
只需使用以下更新:
val updateOperation: DBIO[Int] = all
.filter(_.registrationHash === hash)
.map(u => (u.field1, u.field2, u.field3))
.update((newValue1, newValue2, newValue3))
请注意,上面的updateResult
是DBIO
,其中包含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)