首页 > 解决方案 > 如何在 Slick 中批量插入或更新多行

问题描述

我有一个光滑的模型,我需要根据 insertOrUpdateCalculations 方法中提供的序列来创建或更新它。如果已经有一行(容器、订单和供应商)体积和重量应该更新。否则应创建新行。

case class OrderCalculation(
  id: Long,
  container: Long,
  order: Long,
  vendor: Long,
  volume: Double,
  weight: Double)

class OrderCalculationTable(tag: Tag)
      extends Table[OrderCalculation](tag, "order_calculation") {
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
  def order = column[Long]("containerOrder")
  def orderFk =
    foreignKey("order_fk", order, orderTbl)(_.id)
  def vendor = column[Long]("vendor")
  def vendorFk =
    foreignKey("vendor_fk", vendor, vendorTbl)(_.id)
  def container = column[Long]("container")
  def containerFk =
    foreignKey("container_fk", container, containerTbl)(_.id)
  def volume = column[Double]("volume")
  def weight = column[Double]("weight")
  override def * = (
    id,
    container,
    order,
    vendor,
    volume,
    weight
  ) <> ((OrderCalculation.apply _).tupled, OrderCalculation.unapply)
}

我需要实现具有如下签名的方法:

val orderCalculationTbl = TableQuery[OrderCalculationTable]
case class OrderCalculationSummary(
  orderId: Long,
  containerId: Long,
  vendorId: Long,
  volume: Double,
  weight: Double
 ) 
def insertOrUpdateCalculations(calculations: Seq[OrderCalculationSummary]): Future[Seq[OrderCalculation]] = db.run{
    /// insert or update each record here.
}

我的主要问题是如果我在输入值中没有主键(id),但只有 3 个其他值是其他表的外键,如何更新记录。基本上,我需要有一个查询来检查这 3 个字段并在不提供主键的情况下更新现有行或创建新行。

标签: scalaslick

解决方案


推荐阅读