O SQLAlchemy do Python não limpa a tabela secundária (muitos-para-muitos
Tenho um relacionamento muitos-para-muitos entreUser
areiaTask
s. Quero que a "tabela secundária" (ou seja, a tabela que facilita a relação muitos-para-muitos) seja limpa quando eu excluir umTask
ouUser
. Como posso configurar o SQLAlchemy para isso?
Aqui está um exemplo de código python que demonstra o problema que estou tendo. Nota: Este código é totalmente independente e requer apenas osqlalchemy
module. Se você copiar e colar esse código, poderá executá-lo sem efeitos colaterais e ver o mesmo comportamento. A última linha do script mostra que a linha relevante na "tabela secundária" não foi removida quando eu removi a tarefa correspondente. Todas as asserções passam neste exemplo.
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 [] .