【发布时间】:2014-07-04 19:02:47
【问题描述】:
我正在使用 Scala 的 Slick 和 PostgreSQL。 而且我在单 PK 表上工作得很好。 现在我需要使用具有多个 PK 的表:
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]
当我有空表并使用reports.insert(report) 时,它运行良好。
但是当我使用reports.insertOrUpdate(report) 时,我收到异常:
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 ....
我做错了什么?如何解决?
提前致谢。
PS。我尝试了解决方法 - 尝试通过以下方式实现“如果存在更新则插入”逻辑:
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)
}
但我仍然在更新时遇到异常:
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.
【问题讨论】:
-
insertOrUpdate是什么,我在Slickapi中没有看到这种方法。 -
我有它,当表有一个 PK 时它工作得很好。我还能如何实现 UPSERT 操作?
-
Ende Neu:insertOrUpdate 已添加到 Slick 2.1-M2 中,并将成为 Slick 2.1 的一部分。
-
关于第二个例外。如果 len > 1 你也尝试插入。也许这就是问题所在。疯狂的猜测:)。
标签: postgresql scala slick composite-primary-key upsert