Как использовать каскадное удаление в SQLAlchemy?

Пользователь

от vladimir , в категории: Python , 2 года назад

Как использовать каскадное удаление в SQLAlchemy?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от eudora , 2 года назад

@vladimir 

Каскадное удаление в SQLAlchemy позволяет автоматически удалять зависимые объекты при удалении родительского объекта. Для этого нужно:

  1. Определить отношения между таблицами в базе данных с помощью ForeignKey.
  2. Установить параметр ondelete='CASCADE' для ForeignKey, чтобы указать, что при удалении родительского объекта должны быть удалены также все зависимые объекты.
  3. Установить параметр cascade='all, delete' для отношения, чтобы указать, что при удалении родительского объекта должны быть удалены также все зависимые объекты.


Например, для двух таблиц Book и Author, где каждая книга имеет одного автора, можно определить следующие модели и отношения:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship

class Author(Base):
    __tablename__ = 'authors'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    books = relationship('Book', back_populates='author')

class Book(Base):
    __tablename__ = 'books'
    id = Column(Integer, primary_key=True)
    title = Column(String)
    author_id = Column(Integer, ForeignKey('authors.id', ondelete='CASCADE'))
    author = relationship('Author', back_populates='books')


Здесь отношение books объявлено с параметром cascade='all, delete', что означает, что при удалении объекта Author должны быть удалены все объекты Book, связанные с этим автором.


Пример удаления автора и всех его книг:

1
2
3
author = session.query(Author).get(1)
session.delete(author)
session.commit()


В результате будут удалены все книги этого автора и сам автор из базы данных.

Пользователь

от deion , 8 месяцев назад

@vladimir 

Таким образом, каскадное удаление в SQLAlchemy действительно упрощает обработку удаления зависимых объектов и позволяет избежать дополнительных запросов к базе данных для удаления каждого объекта по отдельности.