Skip to content

Cascade on query([model]).delete() not working #3902

@sqlalchemy-bot

Description

@sqlalchemy-bot

Migrated issue, originally created by Martin Uhrin (@muhrin)

The final assert here fails because session.query([model]).delete doesn't seem to cascade while deleting the object directly has the expected behaviour.

There is a TODO on line 3044 of query.py so I guess this is a known problem.

from sqlalchemy import Column, Integer, String, ForeignKey, Boolean
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref
from sqlalchemy.orm import sessionmaker


def create_bob(sess):
    bob = User(id=1)
    bob.addresses.append(Address())
    sess.add(bob)
    sess.commit()
    return bob


Base = declarative_base()
engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(bind=engine)


class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)


class Address(Base):
    __tablename__ = 'addresses'
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('users.id'))
    user = relationship("User", backref=backref("addresses", cascade='all'))


Base.metadata.create_all(engine)
sess = Session()

bob = create_bob(sess)
assert sess.query(User).count() == 1
assert sess.query(Address).count() == 1

sess.delete(bob)
sess.commit()
assert sess.query(User).count() == 0
assert sess.query(Address).count() == 0

bob = create_bob(sess)
assert sess.query(User).count() == 1
assert sess.query(Address).count() == 1

sess.query(User).delete()
sess.commit()
assert sess.query(User).count() == 0
assert sess.query(Address).count() == 0

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions