Reputation: 96
This is my way to do batch insert in plain SQL in slick, which is kind of troublesome.
db withSession {
(Q.u + "insert into customer (id, name, address) values " +
users.map(toSql).mkString(",")).execute()
}
def toSql(user: User): String = "(%d, '%s', '%s')".format(user.id, user.name, user.address)
I'm wondering is there a better way to do batch insert/update in slick in plain SQL? I'm not a big fan of lifted or direct embedding, it seems Hibernate-ish to me.
Upvotes: 4
Views: 2436
Reputation: 1380
You can use SetParameter as Medina pointed out in the mailinglist (I asked a similar question):
import slick.jdbc.SetParameter
import slick.jdbc.PositionedParameters
val params = Seq("foo", "bar", "baz")
implicit object SetSqlParamList extends SetParameter[Seq[String]] {
override def apply(values: Seq[String], pp: PositionedParameters): Unit = values.foreach(v => pp.setString(v))
}
StaticQuery.query[List[String], User](
s"""SELECT * FROM foo WHERE bar IN (${params.map(_ => "?").mkString(",")})"""
).list(params)
Upvotes: 3