Мы хотели бы запустить patch/partial UPDATE
с помощью Slick (3.0.0), чтобы мы только модифицировали некоторые из полей в записи. Точно, какие поля будут обновляться точно, это будет известно только во время выполнения.
Например, для запроса REST PATCH
.
В настоящее время мы запускаем SELECT
сначала, чтобы получить исходную запись, затем запустите UPDATE
, но было бы лучше сделать это в одном выражении SQL.
Что-то вроде этого:
def patchPerson(name: Option[String], age: Option[Int]) = {
people.filter(_.name === "M Odersky")
.map(p =>
(name, age) match {
case (Some(_), Some(_)) => (p.name, p.age)
case (Some(_), None) => (p.name)
case (None , Some(_)) => (p.age)
}
)
.update(
(name, age) match {
case (Some(_), Some(_)) => (name.get, age.get)
case (Some(_), None) => (name.get)
case (None , Some(_)) => (age.get)
}
)
}
(Пожалуйста, проигнорируйте уродливый код здесь)
Вышеописанное не компилируется со следующим сообщением об ошибке:
Нет соответствующей формы. Слик не знает, как сопоставить данные типы. Возможные причины: T в таблице [T] не соответствует вашему * проекция. Или вы используете неподдерживаемый тип в запросе (например, scalaСписок). Требуемый уровень: slick.lifted.FlatShapeLevel Тип источника: Объект Распакованный тип: T Упакованный тип: G
и
недостаточно аргументов для карты метода: (неявная форма: slick.lifted.Shape [_ <: slick.lifted.FlatShapeLevel, Object, T, G]) slick.lifted.Query [G, Т, Seq]. Неопределенная форма параметра значения.
Я предполагаю, что это происходит потому, что Slick ожидает, что длина и тип кортежа соответствуют результатам для функций filter
и UPDATE
.
Мы попытались использовать класс Slick разнородный список, но также кажется, что длина и типы будут соответствовать.
Есть ли способ записать это в Slick, чтобы мы могли обновить произвольное количество полей в записи с помощью одного вызова базы данных?