SQL Alchemy从多对多删除关联

时间:2019-01-25 17:06:51

标签: python sqlalchemy

我知道我找不到干净的解决方案已经问了这个问题。

我的问题很简单:我有一个具有多对多关联的表。用户有很多工作区,而工作区有很多用户的地方。

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也清除关联的表邀请,而又没有手动清除它的负担?

感谢您的回答

0 个答案:

没有答案