我知道我找不到干净的解决方案已经问了这个问题。
我的问题很简单:我有一个具有多对多关联的表。用户有很多工作区,而工作区有很多用户的地方。
invitations_table = db.Table('invitations', db.Model.metadata,
db.Column('user_id', db.Integer, db.ForeignKey('user.id', ondelete='cascade'), primary_key=True),
db.Column('workspace_id', db.Integer, db.ForeignKey('workspace.id', ondelete='cascade'), primary_key=True)
)
现在我的两个类都这样声明:
class Workspace(db.Model):
id = db.Column(db.Integer, primary_key = True)
...
u_invited = db.relationship("User",
secondary = invitations_table,
cascade = 'all',
back_populates = "w_invited")
class User(db.Model):
id = db.Column(db.Integer, primary_key = True)
...
w_invited = db.relationship("Workspace",
secondary = invitations_table,
back_populates = "u_invited")
现在,如果删除我的工作空间,我也无法在关联表上级联删除操作:
def delete_all_workspace(self):
workspace = Workspace.query.filter_by(owner=self)
# for w in workspace.all():
# w.u_invited.clear()
succeed = workspace.delete()
db.session.commit()
问题是:正如某些人建议的那样,我需要手动循环到我的对象列表中,然后调用clear()以免出现此异常:
sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError) update or delete on table "workspace" violates foreign key constraint "invitations_workspace_id_fkey" on table "invitations"
DETAIL: Key (id)=(142) is still referenced from table "invitations".
尽管ondelete ='cascade'足以告诉sqlalchemy也删除关联表,但这并不能按预期工作。
我的问题是:是否有一种方法可以告诉SQLAlchemy也清除关联的表邀请,而又没有手动清除它的负担?
感谢您的回答