SQLAlchemy de Python no limpia la tabla secundaria (de muchos a muchos)

Tengo una relación de muchos a muchos entreUsers yTasks. Quiero que la "tabla secundaria" (es decir, la tabla que facilita la relación de muchos a muchos) se elimine cuando elimine unTask oUser. ¿Cómo puedo configurar SQLAlchemy para esto?

Aquí hay un código de muestra de Python que demuestra el problema que estoy teniendo. Nota: este código es totalmente autónomo y solo requiere lasqlalchemy módulo. Si copia y pega este código, debería poder ejecutarlo sin efectos secundarios y ver el mismo comportamiento usted mismo. La última línea del script muestra que la fila relevante en la "tabla secundaria" no se eliminó cuando eliminé la tarea correspondiente. Todas las afirmaciones pasan en este ejemplo.

from sqlalchemy import create_engine, Column, Integer, Text, Table, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Session, relationship

Model = declarative_base()

class User(Model):
    __tablename__ = 'users'
    id = Column('user_id', Integer, primary_key=True)
    email = Column('email', Text, unique=True)

    def __init__(self, email):
        self.email = email

user_tasks = Table('user_tasks', Model.metadata,
    Column('user_id', Integer, ForeignKey('users.user_id')),
    Column('task_id', Integer, ForeignKey('tasks.task_id')))

class Task(Model):
    __tablename__ = 'tasks'
    id = Column('task_id', Integer, primary_key=True)
    description = Column('description', Text)
    assigned_to = relationship('User', secondary=user_tasks, backref='tasks')

    def __init__(self, description):
        self.description = description

if __name__ == '__main__':
    engine = create_engine('sqlite:///:memory:')
    Model.metadata.create_all(engine)
    s = Session(engine)
    the_user = User('user')
    s.add(the_user)
    s.commit()
    assert s.query(User).all() == [the_user]
    user_task = Task('user_one task')
    user_task.assigned_to.append(the_user)
    s.add(user_task)
    s.commit()
    assert s.query(Task).all() == [user_task]
    assert s.query(user_tasks).all() == [(1,1)]
    s.query(Task).delete()
    s.commit()
    assert s.query(Task).all() == []
    assert s.query(User).all() == [the_user]
    assert s.query(user_tasks).all() == [(1,1)]  # I was expecting [] .

Respuestas a la pregunta(4)

Su respuesta a la pregunta