【问题标题】:Slick 3.0: Delete rows from multiple tables in a transactionSlick 3.0:从事务中的多个表中删除行
【发布时间】:2015-09-11 17:16:26
【问题描述】:

我想从几个表中删除行。下面的伪 SQL 语句描述了我的确切意图,

delete from users where oid={user_oid};
login_infos_oid = select login_infos_oid from users_login_infos where users_oid={user_oid};
delete from users_login_infos where users_oid={user_oid};
delete from password_infos where login_infos_oid={login_infos_oid};
delete from login_infos where oid={login_infos_oid};

users_login_infos 表有 2 列 users_oidlogin_infos_oid 并连接 userslogin_infos 表。我如何在事务中的 Slick 3.x 中很好地做到这一点?谢谢。

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    我认为这不是一个好的解决方案,但目前就是这样,

    val userQuery = slickUsers.filter(_.username === username)
    val userLoginInfoQuery = slickUserLoginInfos.filter(_.userOid in userQuery.map(_.oid))
    val loginInfoQuery = slickLoginInfos.filter(_.oid in userLoginInfoQuery.map(_.loginInfoOid))
    val passwordInfoQuery = slickPasswordInfos.filter(_.loginInfoOID in userLoginInfoQuery.map(_.loginInfoOid))
    
    db.run((loginInfoQuery.delete andThen
      passwordInfoQuery.delete andThen
      userLoginInfoQuery.delete andThen
      userQuery.delete).transactionally)
    

    【讨论】:

      【解决方案2】:

      Slick 目前不支持开箱即用的原因(至少在 3.3.3 或更高版本之前)是因为并非所有数据库系统都支持这种查询,例如 SQLite。此外,所有数据库系统的语法也不完全相同。

      目前在 Slick 的 GitHub 上存在一个问题:https://github.com/slick/slick/issues/684

      您在答案中使用的子查询方法将是最好的方法。

      或者,我想您应该能够在自定义 Slick 配置文件定义中添加对联接删除查询的支持。

      【讨论】:

      • 虽然已经有一段时间了,但很高兴知道?谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      相关资源
      最近更新 更多