Chcielibyśmy uruchomić łatkę/częściową UPDATE
przy pomocy Slick (3.0.0), aby zmodyfikować tylko niektóre pola w rekordzie. Dokładnie to, które pola będą dokładnie aktualizowane, będzie znane tylko w czasie wykonywania.W jaki sposób uruchamiasz aktualizację poprawki/częściowej bazy danych w Scala Slick?
Na przykład dla REST PATCH
request.
Obecnie uruchamiamy najpierw SELECT
, aby uzyskać oryginalny rekord, a następnie uruchomić UPDATE
, ale byłoby fajniej zrobić to w pojedynczej instrukcji SQL.
coś takiego:
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)
}
)
}
(proszę ignorować brzydkie kod tutaj)
Powyższe nie skompilować z następującym komunikatem o błędzie:
Nie dopasowywania Kształt znalezionego . Slick nie wie, jak zmapować podane typy . Możliwe przyczyny: T w tabeli [T] nie pasuje do projekcji * . Lub używasz nieobsługiwanego typu w kwerendzie (np. Scala Lista). Wymagany poziom: slick.lifted.FlatShapeLevel typ Źródło: Object rozpakowywane typ: T pakiety typu: G
oraz:
nie wystarczająco dużo argumentów dla metody mapie: (niejawny kształt: slick.lifted .Shape [_ <: slick.lifted.FlatShapeLevel, Object, T, G]) slick.lifted.Query [G, T, Seq]. Nieokreślony kształt parametru wartości.
Zakładam, to dlatego, że Slick oczekuje długość krotka i typ pasujące wyniki dla obu funkcji filter
i update
.
Próbowaliśmy używać klasy Slick heterogeneous list, ale wydaje się również, że oczekiwana długość i typy pasują do siebie.
Czy istnieje sposób na zapisanie tego w wersji Slick, abyśmy mogli zaktualizować dowolną liczbę pól w rekordzie za pomocą jednego wywołania bazy danych?
Czy znalazłeś rozwiązanie? – 757071
A co z uruchomieniem natywnego kodu SQL? –
Dodałem nagrodę, ponieważ mam ten sam problem, co autor. @LukasEder, który nie działałby dobrze, gdybyś nie wiedział, które klucze łatasz. Na przykład. Mam do aktualizacji dużą klasę Case użytkownika i chciałbym mieć ogólny punkt końcowy PATCH, do którego mogę po prostu wysłać jedno zaktualizowane pole. – Jeroen