SQLAlchemy: удаление дочерних объектов не обновляет родительский - PullRequest
0 голосов
/ 29 сентября 2018

В SQLAlchemy 1.2.11, у меня есть две модели ORM, определенные так (упрощенно):

from sqlalchemy.orm import (
    Column,
    Integer,
    ForeignKey,
)
from sqlalchemy.orm import relationship

class Parent(Base):
    __tablename__ = 'parent'

    # columns
    id = Column(Integer, primary_key=True)

    # relationships
    children = relationship('Child', back_populates='parent')

class Child(Base):
    __tablename__ = 'child'

    # columns
    id = Column(Integer, primary_key=True)
    parent_id = (Integer, ForeignKey('parent.id', ondelete='cascade'))

    # relationships
    parent = relationship('Parent', back_populates='children')

Я создаю оба объекта, добавляю в сеанс и очищаю:

parent = Parent()
child = Child()
parent.children.append(child)

session.add(child)
session.flush()

Наконец, я удаляю дочерний объект:

session.delete(child)
session.flush()

Все соответствующие операторы SQL сбрасываются;как начальные вставки, так и последующее удаление.

Я ожидал бы, так как этот сеанс "отслеживается", что len(parent.children) будет == 0.Однако дочерний объект все еще присоединен.

Я поиграл с опциями cascade по обе стороны отношения, но ни один не обновляет сеанс при операции сброса.Только session.commit(), кажется, залипает, заставляя следующий набор SQL-операций происходить в другом блоке транзакции , вызывая побочный эффект отложенной загрузки при вызове пути parent.children и запуске 'refreshed'SQL в БД.

Мой вопрос: возможно ли, чтобы SQLAlchemy удалял удаленные объекты из parent.children, которые, как он знает, удаляются в операции сброса без фиксации?

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