光滑3:insertOrUpdate无法正常工作

时间:2017-02-16 14:45:07

标签: postgresql slick upsert

我正在使用Postgresql 9.6.1,Plya! 2.5和play-slick 2.0.2。

(我也使用slick-pg 0.14.3,但我不认为这会改变任何东西。)

我以非常直接的方式使用insertOrUpdate,但我仍然有一个独特的例外。

我使用insertOrUpdate进行了非常简单的测试: 如果我多次运行它总是得到一个sql异常:

ERROR: duplicate key value violates unique constraint "ga_client_id_pkey"
  Detail: Key (client_id)=(1885746393.1464005051) already exists

但是,我的表定义为client_id作为主键:

def clientId = column[String]("client_id", O.PrimaryKey)

并在sql中定义如下:

client_id    TEXT NOT NULL UNIQUE PRIMARY KEY

测试的功能只是:

db.run(gaClientIds.insertOrUpdate(gaClientId))

并且控制器只调用此方法而不执行任何其他操作。

一个奇怪的事情是,多次启动方法本身并不会导致错误,但控制器确实会调用该方法。

insertOrUpdate光滑的功能还不确定还是我错过了什么?

1 个答案:

答案 0 :(得分:5)

insertOrUpdate仅在MySQL驱动程序

中受支持

http://slick.lightbend.com/doc/3.2.1/supported-databases.html

您可以尝试使用此库,它为您提供insertOrUpdate / upsert

的实现

https://github.com/tminglei/slick-pg

这就是我们在当前项目中使用它的方式。

import com.github.tminglei.slickpg._
import com.typesafe.config.ConfigFactory
import slick.basic.Capability

object DBComponent {

  private val config = ConfigFactory.load()

  val driver = config.getString("rdbms.properties.driver") match {
    case "org.h2.Driver" => slick.jdbc.H2Profile
    case _               => MyPostgresProfile
  }

  import driver.api._

  val db: Database = Database.forConfig("rdbms.properties")

}

trait MyPostgresProfile extends ExPostgresProfile {

  // Add back `capabilities.insertOrUpdate` to enable native `upsert` support; for postgres 9.5+
  override protected def computeCapabilities: Set[Capability] =
    super.computeCapabilities + slick.jdbc.JdbcCapabilities.insertOrUpdate

  override val api: MyAPI.type = MyAPI

  object MyAPI extends API
}

object MyPostgresProfile extends MyPostgresProfile