Форум сайта python.su
0
Здравствуйте.
Имеется база со связанными логически таблицами.
Например таблица с пользователями а так же таблица с вносимыми ими данными (например письма под id пользователя).
Если нужно удалить пользователя то и пропадет связь этого пользователя с уже существующими данными.
Есть ли готовое решение для проверки на удаление связных данных или использовать просто. Sql запрос и проверять по id пользователя.
Офлайн
253
Офлайн
1
По хорошему в параметрах таблиц должно быть указано “каскадное удаление”. В этом случае движок БД всё сделает сам.
Офлайн
0
Вопрос не в удалении, а запрет на удаление.
Точней если я жмакаю удалить пользователя и отрабатывает сеачала валидация на проверку связей, если связи есть то предупредить и не удалять (чтобы не удалить все связи)
Офлайн
1
Если они связаны только логически, а не на уровне ссылок в БД, то только сначала реализовать проверку.
Если есть ссылки в БД, то через try - при наличие ссылок должно вернуть ошибку.
Офлайн
0
Да ссылки настроены через relationship() и ForeignKey.
Тоесть в таблице данных есть id пользователя.
В этом случае если удалю пользователя с существующими связями с таблицей данных то будет исключение в try?
Офлайн
1
Верно. Запись не должна быть удалена, и будет возвращена соответствующая ошибка.
P.S. Надеюсь Вы ведёте разработку на тестовом стенде.
Офлайн
0
lifemakerКонечно. Совесть чиста.
P.S. Надеюсь Вы ведёте разработку на тестовом стенде.
Офлайн
0
Проверил, и не работает. Все равно удаляется даже через try.
Есть две таблицы с пользователями и типами. Следовательно если удалить тип пользователя к которому уже привязаны много других пользователей, то пользователи останутся без типа (что не есть хорошо).
class users_db(db.Model): id = db.Column(db.Integer, primary_key = True) name = db.Column(db.String(30)) id_user_type = db.Column(db.Integer, db.ForeignKey('users_type.id')) user_type = db.relationship('users_type', backref=db.backref('type', lazy='joined')) class users_type(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100))
users_type.query.filter_by(id=req_form.get('del_id')).delete()
Офлайн