Hung Lin
Hung Lin

Reputation: 96

How to do batch insert use plain SQL in scala slick?

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

Answers (1)

Michael Pollmeier
Michael Pollmeier

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)

https://groups.google.com/d/msgid/scalaquery/cd028e33-42e8-4a26-85fc-e3b1b700e1f6%40googlegroups.com?utm_medium=email&utm_source=footer

Upvotes: 3

Related Questions