gpt4 book ai didi

scala - 在 Slick 3 中构建动态更新查询

转载 作者:行者123 更新时间:2023-12-02 04:46:01 24 4
gpt4 key购买 nike

我正在寻找一种方法来生成仅在运行时已知的多个列的更新查询。

例如,给定一个 List[(String, Int)] , 我将如何以 UPDATE <table> SET k1=v1, k2=v2, kn=vn 的形式生成查询对于列表中的所有键/值对?

我发现,给定一个键/值对,一个普通的 SQL 查询可以构建为 sqlu"UPDATE <table> SET #$key=$value (其中 key 来自受信任的来源以避免注入(inject)),但我没有成功将其推广到更新列表而不对每个更新列表运行查询。

这可能吗?

最佳答案

这是一种方法。我在这里创建了一个表定义 T,其中表名和列名 (TableDesc) 作为隐式参数。我本以为应该可以明确地设置它们,但我找不到。例如,创建表查询实例 aTable 和 bTable。然后我插入并选择一些值,最后我在 bTable 中更新一个值。

import slick.driver.H2Driver.api._
import scala.concurrent.Await
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.util.{Failure, Success}

val db = Database.forURL("jdbc:h2:mem:test1;DB_CLOSE_DELAY=-1", "sa", "", null, "org.h2.Driver")

case class TableDesc(tableName: String, intColumnName: String, stringColumnName: String)

class T(tag: Tag)(implicit tableDesc: TableDesc) extends Table[(String, Int)](tag, tableDesc.tableName) {
def stringColumn = column[String](tableDesc.intColumnName)

def intColumn = column[Int](tableDesc.stringColumnName)

def * = (stringColumn, intColumn)
}

val aTable = {
implicit val tableDesc = TableDesc("TABLE_A", "sa", "ia")
TableQuery[T]
}

val bTable = {
implicit val tableDesc = TableDesc("TABLE_B", "sb", "ib")
TableQuery[T]
}

val future = for {
_ <- db.run(aTable.schema.create)
_ <- db.run(aTable += ("Hi", 1))
resultA <- db.run(aTable.result)
_ <- db.run(bTable.schema.create)
_ <- db.run(bTable ++= Seq(("Test1", 1), ("Test2", 2)))
_ <- db.run(bTable.filter(_.stringColumn === "Test1").map(_.intColumn).update(3))
resultB <- db.run(bTable.result)
} yield (resultA, resultB)
Await.result(future, Duration.Inf)
future.onComplete {
case Success(a) => println(s"OK $a")
case Failure(f) => println(s"DOH $f")
}
Thread.sleep(500)

我最后得到了 sleep 语句来断言 Future.onComplete 有时间在应用程序结束之前完成。还有其他办法吗?

关于scala - 在 Slick 3 中构建动态更新查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32753917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com