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.