【问题标题】:SLICK: To insert value in 3 different tables using one slick api callSLICK:使用一个 slick api 调用在 3 个不同的表中插入值
【发布时间】:2020-06-01 02:55:47
【问题描述】:

问题与光滑有关: 我有三张桌子:
1) 用户
2)团队2成员
3)Team2Owners

在我对用户的发布请求中,我传递了memberOfmanagerOf 的值,这些值将分别插入到表Team2membersTeam2Owners 中,而不是插入到用户表中。虽然发布请求的其他值将插入“用户”表中。

我的 Post 请求如下所示:

{"kind": "via#user",
      "userReference":{"userId":"priya16"},
      "user":"preferredNameSpecialChar@domain1.com","memberOf":{"teamReference":{"organizationId":"airtel","teamId":"supportteam"}},
       "managerOf":{"teamReference":{"organizationId":"airtel","teamId":"supportteam"}},
      "firstName":"Special_fn1",
      "lastName":"specialChar_ln1",
      "preferredName":[{"locale":"employee1","value":"@#$%^&*(Z0FH"}],
      "description":" preferredNameSpecialChar test "}  

我正在形成如下所示的查询:
当仅定义 memberInsert 时,查询似乎工作正常,当我尝试定义这两个值时,即memberInsertmanagerInsert 然后插入仅发生在第二个值。

val query = config.api.customerTableDBIO(apiRequest.parameters.organizationId).flatMap { tables =>
      val userInsert = tables.Users returning tables.Users += empRow
      val memberInsert = inputObject.memberOf.map(m => m.copy(teamReference = m.teamReference.copy(organizationId = apiRequest.parameters.organizationId))).map { r =>
        for {
          team2MemberRow <- tables.Team2members returning tables.Team2members += Teams2MembersEntity.fromEmtToTeams2Members(r, empRow.id)
          team <- tables.Teams.filter(_.id === r.teamReference.teamId.toLowerCase).map(_.friendlyName).result.headOption
        } yield (team2MemberRow, team)
      }
      val managerInsert = inputObject.managerOf.map(m => m.copy(teamReference = m.teamReference.copy(organizationId = apiRequest.parameters.organizationId))).map { r =>
        for {
          team2OwnerRow <- tables.Team2owners returning tables.Team2owners += Teams2OwnersEntity.fromEmtToTeam2owners(r, empRow.id)
          team <- tables.Teams.filter(_.id === r.teamReference.teamId.toLowerCase).map(_.friendlyName).result.headOption
        } yield (team2OwnerRow, team)
      }

      userInsert.flatMap { userRow =>
        val user = UserEntity.fromDbEntity(userRow)
        if (memberInsert.isDefined) memberInsert.get
          .map(r => user.copy(memberOf = Some(Teams2MembersEntity.fromEmtToMemberRef(r._1, r._2.map(TeamEntity.toApiFriendlyName).getOrElse(List.empty)))))
        else DBIO.successful(user)
        if (managerInsert.isDefined) managerInsert.get
          .map(r => user.copy(managerOf = Some(Teams2OwnersEntity.fromEmtToManagerRef(r._1, r._2.map(TeamEntity.toApiFriendlyName).getOrElse(List.empty)))))
        else DBIO.successful(user)
      }
    }

【问题讨论】:

    标签: scala slick scalaquery


    【解决方案1】:

    当只定义 memberInsert 时,查询似乎工作正常,当我尝试定义这两个值时,即 memberInsert 和 managerInsert 然后插入只发生在第二个值。

    问题似乎出在对flatMap 的最终调用上。

    这应该返回一个DBIO[T]。但是,您的表达式会在各个分支中生成DBIO[T],但flatMap 只会返回一个值。这可以解释为什么您看不到所有正在运行的操作。

    相反,您可以为每个步骤分配一个值并对其进行排序。还有lots of ways you could do that,比如用DBIO.seq或者andThen

    这是一种可能适合您的方法的草图......

    val maybeInsertMemeber: Option[DBIO[User]] =
      member.map( your code for constructing an action here )
    
    val maybeInsertManager Option[DBIO[User]] =
      manager.map( your code for constructing an action here )
    
    DBIO.sequenceOption(maybeInsertMember) andThen
      DBIO.sequenceOption(maybeInsertManager) andThen
      DBIO.successful(user)
    

    该表达式的结果是一个DBIO[User],它将三个查询组合在一起。

    【讨论】:

      猜你喜欢
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多