Найти - Пользователи
Полная версия: Sqlalchemy проверка при удалении связных записей
Начало » Python для новичков » Sqlalchemy проверка при удалении связных записей
1
freeddos
Здравствуйте.
Имеется база со связанными логически таблицами.
Например таблица с пользователями а так же таблица с вносимыми ими данными (например письма под id пользователя).
Если нужно удалить пользователя то и пропадет связь этого пользователя с уже существующими данными.
Есть ли готовое решение для проверки на удаление связных данных или использовать просто. Sql запрос и проверять по id пользователя.
lifemaker
По хорошему в параметрах таблиц должно быть указано “каскадное удаление”. В этом случае движок БД всё сделает сам.
freeddos
Вопрос не в удалении, а запрет на удаление.
Точней если я жмакаю удалить пользователя и отрабатывает сеачала валидация на проверку связей, если связи есть то предупредить и не удалять (чтобы не удалить все связи)
lifemaker
Если они связаны только логически, а не на уровне ссылок в БД, то только сначала реализовать проверку.
Если есть ссылки в БД, то через try - при наличие ссылок должно вернуть ошибку.
freeddos
Да ссылки настроены через relationship() и ForeignKey.
Тоесть в таблице данных есть id пользователя.
В этом случае если удалю пользователя с существующими связями с таблицей данных то будет исключение в try?
lifemaker
Верно. Запись не должна быть удалена, и будет возвращена соответствующая ошибка.

P.S. Надеюсь Вы ведёте разработку на тестовом стенде.
freeddos
lifemaker
P.S. Надеюсь Вы ведёте разработку на тестовом стенде.
Конечно. Совесть чиста.
freeddos
Проверил, и не работает. Все равно удаляется даже через 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()
del_id беру из пришедшего GET запроса, облачил это удаление в try, ошибки не словил и дал удалить.

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB