SQLAlchemy de Python no limpia la tabla secundaria (de muchos a muchos)
Tengo una relación de muchos a muchos entreUser
s yTask
s. 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 [] .