Używam Scala 'Slick i PostgreSQL. I pracuję dobrze z tabelami z jednym PK. Teraz trzeba użyć tabeli z wieloma PK:Scala's Slick z wieloma PK insertOrUpdate() zgłasza wyjątki ERROR: błąd składni na końcu wejścia
case class Report(f1: DateTime,
f2: String,
f3: Double)
class Reports(tag: Tag) extends Table[Report](tag, "Reports") {
def f1 = column[DateTime]("f1")
def f2 = column[String]("f2")
def f3 = column[Double]("f3")
def * = (f1, f2, f3) <> (Report.tupled, Report.unapply)
def pk = primaryKey("pk_report", (f1, f2))
}
val reports = TableQuery[Reports]
kiedy mam pustą tabelę i używać reports.insert(report)
to działa dobrze. Ale gdy używam reports.insertOrUpdate(report)
otrzymuję i wyjątek:
Exception in thread "main" org.postgresql.util.PSQLException: ERROR: syntax error at end of input
Position: 76
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
at ....
Co robię źle? Jak to naprawić?
Z góry dziękuję.
PS. Próbowałem obejście - starał się realizować „jeśli istnieje aktualizacji innego insert” logiki przez:
val len = reports.withFilter(_.f1 === report.f1).withFilter(_.f2 === report.f2).length.run.toInt
if(len == 1) {
println("Update: " + report)
reports.update(report)
} else {
println("Insert: " + report)
reports.insert(report)
}
Ale wciąż wyjątek na aktualizacji:
Exception in thread "main" org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "pk_report"
Detail: Key ("f1", f2)=(2014-01-31 04:00:00, addon_io.aha.connect) already exists.
Co to jest 'insertOrUpdate', nie widzę takiej metody w apikcie' Zręczny'. –
Mam go i działa dobrze, gdy tabela ma jeden PK. Jak inaczej mogę wdrożyć działanie UPSERT? –
Ende Neu: insertOrUpdate został dodany w Slick 2.1-M2 i będzie częścią Slick 2.1. – cvogt