sqlalchemy: в чем разница между объявлением каскада в отношении внешнего ключа и отношением? - PullRequest
7 голосов
/ 18 мая 2010

В чем разница между объявлением каскада внутри внешнего ключа и отношений?

class Contact(Base):
    __tablename__ = 'contacts'
    id = Column(Integer, primary_key=True)
    addresses = relation("Address", backref="contact")

class Address(Base):
    __tablename__ = 'addresses'
    id = Column(Integer, primary_key=True)
    contact_id = Column(Integer, ForeignKey('contact.id', onupdate="CASCADE", ondelete="CASCADE")))

против

class Contact(Base):
    __tablename__ = 'contacts'
    id = Column(Integer, primary_key=True)
    addresses = relation("Address", backref="contact", cascade="all, delete-orphan")

class Address(Base):
    __tablename__ = 'addresses'
    id = Column(Integer, primary_key=True)
    contact_id = Column(Integer, ForeignKey('contact.id'))

с объявлением внешнего ключа кажется, что каскад применяется на уровне базы данных. как работают отношения? спасибо!

1 Ответ

6 голосов
/ 18 мая 2010

Вы правы, что каскад внешних ключей выполнен на уровне базы данных. Возможно, неудивительно, что подход на основе отношений делается на уровне Python. Когда удаляется родительский элемент из сеанса, SQLAlchemy читает отношение и выдает удаление всем членам, обрабатывая любые другие каскады.

Также обратите внимание, что если вы используете каскад баз данных, вам также необходимо настроить отношения, чтобы учитывать этот факт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...