Slick 3.0: удаление строк из нескольких таблиц в транзакции

Я хочу удалить строки из нескольких таблиц. Мое точное намерение изображено в псевдо-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_oid а также login_infos_oid и присоединяется users а также login_infos таблицы Как мне сделать это в Slick 3.x внутри транзакции? Благодарю.

2 ответа

Я не думаю, что это хорошее решение, но пока это то, что есть,

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)

Причина, по которой Slick в настоящее время не поддерживает это из коробки (по крайней мере, до версии 3.3.3или выше) потому, что не все системы баз данных поддерживают этот тип запросов, например SQLite. Кроме того, синтаксис не является одинаковым для всех систем баз данных.

В настоящее время на сайте Slick GitHub есть проблема: https://github.com/slick/slick/issues/684

Подход подзапроса, который вы используете в своем ответе, будет лучшим подходом.

В качестве альтернативы, я полагаю, вы сможете добавить поддержку запроса соединения-удаления в настраиваемом определении профиля Slick.

Другие вопросы по тегам