是否可以针对sqlite数据库执行具有可变长度的子句内批处理更新?
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文本,以使子句中的每个值都具有?
。对于批量更新,这是不可能的,因为不同的行具有不同数量的值。
答案 0 :(得分:0)
我的解决方法是按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()
}
}