【问题标题】:Slick 3 - Insert into multiple tables, transactionally, based on other tableSlick 3 - 基于其他表以事务方式插入多个表
【发布时间】:2023-03-14 06:50:01
【问题描述】:

我要做的是以事务方式插入 3 个表,但后面的插入基于第一个。

以下是不同的查询:

val personId = persons returning persons.map(_.id)) += Person(occupation)
translatedProperty += TranslatedProperty(languageId, propertyId, propertyName)
personProperties += PersonProperty(personId, propertyId, propertyValue)

现在我从某处获得Seq(propertyName, propertyValue) 并对其进行迭代。

如果我像上面那样按顺序插入,一切正常,直到它不起作用,因为说数据库“崩溃”。因此,我想以事务方式进行上述插入。

我试过了:

val dbAction = (for {
  val personId = persons returning persons.map(_.id)) += Person(occupation)
  props <- (properties.values.map {
    x =>
    {
      val name = x.key
      val value = x.value

      translatedProperties += TranslatedProperty(languageId, propertyId, name)
      personProperties += PersonProperty(personId, propertyId, value)
    }
  })
} yield ()).transactionally

db.run(dbAction)

这给了我一个编译错误:

[错误] 发现:Seq[Unit] [错误] 必需:slick.dbio.DBIOAction[?,?,?] [错误] 道具

然后我尝试使用props = (properties.values.map { ...(而不是&lt;-,我使用了=)但无济于事。该人被插入,但从未插入属性。

我在这里做错了什么?

我认为这是因为 props 将是 Seq[FixedSqlAction] 而不仅仅是一个?

我应该提到我在这里使用的是 h2。

【问题讨论】:

    标签: database scala h2 slick slick-3.0


    【解决方案1】:

    我认为这是因为 props 将是 Seq[FixedSqlAction] 而不仅仅是一个?

    是的,就是这个原因。

    解决您的问题的方法是将properties.values.map... 部分简单地包装到DBIO.seq 中,如下所示:

    val dbAction = (for {
      val personId = persons returning persons.map(_.id)) += Person(occupation)
      props <- DBIO.seq(properties.values.map {
        x =>
        {
          val name = x.key
          val value = x.value
    
         val insertTranslatedProperties = translatedProperties += TranslatedProperty(languageId, propertyId, name)
         val insertPersonProperties = personProperties += PersonProperty(personId, propertyId, value)
    
         insertTranslatedProperties andThen insertPersonProperties 
        }
      }: _*)
    } yield ()).transactionally
    

    还将两个内部插入与andThen 链接在一起,以将它们合并为一个DBIOAction

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多