2013-10-10 2 views
3

Это мой способ сделать пакетную вставку в простой SQL в slick, что является довольно хлопотным.Как сделать пакетную вставку использовать простой SQL в scala slick?

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) 

Мне интересно, есть ли лучший способ сделать пакетную вставку/обновление в slick в простом SQL? Я не большой поклонник поднятого или прямого встраивания, мне кажется, Hibernate-ish.

+2

Я не знаю, ваше определение Hibernate-иш, но, по нашему мнению, это совсем другое. Поднятое вложение предоставляет вам удобный для программирования (!), (Доменный) язык функционального программирования для написания запросов. Для этого требуется ментальный переход, но после того, как вы это почувствуете, вы должны писать все запросы IMHO. Наш разговор Scala Days 2013 должен помочь передать идею: http://www.parleys.com/play/51c2e20de4b0d38b54f46243/ – cvogt

+0

Крис, как дела? Не знаю, помните ли вы, но мы болтали в Scala Days 2013, и я тоже был в вашей презентации. Поднятое вложение имеет несколько интересных идей, но прибегает к некоторым ограничениям, которые мне нужно найти, чтобы взломать, например, поля класса case и столбцы таблицы не являются 1 на 1 сопоставлении, или для обработки другой базы данных я должен распространять две разные таблицы (мы использовать mysql в производстве и h2 для тестирования). Я сделал что-то неправильно? Каковы ваши предложения по этой проблеме? –

+1

[why comment has char limit ??] Честно говоря, я все еще чувствую, что простой sql более гибкий и простой, это строка, поэтому не компилятор, но я могу использовать модульные тесты для проверки инструкции sql. Имеет ли slick (или планирует) способ сделать пакетную вставку/обновление как Anorm? –

ответ

4

Вы можете использовать SetParameter, как Медина отметил в список рассылки (я задавал подобный вопрос):

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

+0

Как это вставить или обновить? – nafg

Смежные вопросы