Postgresql 光滑3:插入更新不工作

Postgresql 光滑3:插入更新不工作,postgresql,slick,upsert,Postgresql,Slick,Upsert,我正在使用slick和Postgresql 9.6.1,Plya!2.5,玩滑头2.0.2 (我也使用了slick pg 0.14.3,但我认为它不会改变任何东西。) 我以非常直接的方式使用了insertOrUpdate,但我仍然得到了一个独特的例外 我有一个非常简单的测试,使用insertOrUpdate: 如果我多次运行它,总是会出现sql异常: ERROR: duplicate key value violates unique constraint "ga_client_id_pkey"

我正在使用slick和Postgresql 9.6.1,Plya!2.5,玩滑头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\u id
作为主键定义的:

def clientId = column[String]("client_id", O.PrimaryKey)
并在sql中定义如下:

client_id    TEXT NOT NULL UNIQUE PRIMARY KEY
被测试的功能只是:

db.run(gaClientIds.insertOrUpdate(gaClientId))
控制器只调用这个方法,而不做其他事情

奇怪的是,多次启动方法本身不会导致错误,但是控制器会导致错误,尽管它只调用方法


insertOrUpdate
slick函数还不确定,还是我遗漏了什么

只有MySQL驱动程序才支持insertOrUpdate

您可以尝试这个库,它提供了insertOrUpdate/upsert的实现

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

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

在我这方面,同样的问题出现在3.2.1上@Simon你找到解决方案了吗?不,不幸的是,我找到的唯一解决方案是用纯sql编写数据库调用…这也是我的解决方案,在我的情况下,有时会保存,有时会失败。我无法在本地复制它,虽然在上层环境中使用相同的库和版本,但有时在生产中会达到收支平衡。在我看来,文档支持每个驱动程序,我以前从未见过这个页面。谢谢你的回复。