[英]Batch update with in clause
是否有可能針對sqlite db以可變長度的條款執行批量更新?
val data = Seq(
Seq(Set(1,2,3), 50),
Seq(Set(4,5,6,7), 51)
)
NamedDB(symbol).localTx { implicit s: DBSession =>
sql"""
update table_a
set xs=(
select group_concat(x) from (
select distinct x from table_b where id in (?)
)
) where id=?
""".batch(xs.map(_.data): _*).apply()
}
此默認方法導致scalikejdbc記錄該參數已設置為對象(警告?),結果是未應用任何更新。
我嘗試使用參數綁定器,但由於sqlite(及其JDBC驅動程序)不支持數組,因此無法將in (?)
參數設置為數組類型。
另一種方法是將SQL文本更改為?
子句中的每個值。 對於批量更新,這是不可能的,因為不同的行具有不同數量的值。
我的解決方法是按in子句參數的數量對數據進行分組,並對每個子句執行單獨的批處理更新。
xs.map(_.data).groupBy(_.size - 1).foreach { case (length, data) =>
NamedDB(symbol).localTx { implicit s: DBSession =>
val inClauseParams = ("?" * length).mkString(",")
SQL(
s"""
update table_a set xs=(
select group_concat(x) from (
select distinct x from table_b where id in ($inClauseParams)
)
) where id=?
"""
).batch(data: _*).apply()
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.