Python 级联删除自引用多对多关系

Python 级联删除自引用多对多关系,python,sqlite,sqlalchemy,Python,Sqlite,Sqlalchemy,我有一个包含以下表的SQLite数据库: fits_table = Table("fits", saveddata_meta, Column("ID", Integer, primary_key = True), Column("ownerID", ForeignKey("users.ID"), nullable = True, index = True),

我有一个包含以下表的SQLite数据库:

fits_table = Table("fits", saveddata_meta,
                         Column("ID", Integer, primary_key = True),
                         Column("ownerID", ForeignKey("users.ID"), nullable = True, index = True),
                         Column("shipID", Integer, nullable = False, index = True),
                         Column("name", String, nullable = False),
                         Column("timestamp", Integer, nullable = False),
                         Column("characterID", ForeignKey("characters.ID"), nullable = True),
                         Column("damagePatternID", ForeignKey("damagePatterns.ID"), nullable=True),
                         Column("booster", Boolean, nullable = False, index = True, default = 0))

projectedFits_table = Table("projectedFits", saveddata_meta,
                            Column("sourceID", ForeignKey("fits.ID"), primary_key = True),
                            Column("victimID", ForeignKey("fits.ID"), primary_key = True),
                            Column("amount", Integer))
mapper(Fit, fits_table,
       properties = {
                     "_Fit__projectedFits" : relation(Fit,
                                                      primaryjoin = projectedFits_table.c.victimID == fits_table.c.ID,
                                                      secondaryjoin = fits_table.c.ID == projectedFits_table.c.sourceID,
                                                      secondary = projectedFits_table,
                                                      collection_class = HandledProjectedFitList)
                     })
它基本上是一个关系表,将一个匹配链接到另一个匹配

我一直在试图找出级联删除的正确方法,但我无法让它工作。我想,如果一个Fit被删除,那么它也会删除关系表中Fit ID位于source或牺牲品列中的任何行

编辑:我忘记添加我尝试的级联标志

cascade='all,delete,delete orphan',single\u parent=True,
-不起作用。在face中,手动删除关系行也会删除父项(与sourceID匹配的内容)

cascade='delete',single_parent=True,
-没有上述设置存在的问题,但在删除拟合时仍然没有删除关系记录

cascade='all,delete',single_parent=True,
-同上

编辑2: 我一直在摆弄它,没有添加
cascade
属性,它可以正常工作。让我解释一下:

如果将拟合B链接到拟合A(在本例中,A是父项),则删除拟合B,它不会删除关系。但是,如果我删除fit A,它会删除关系

我想我刚才的想法完全错了。当我有一个fit实例时,它会收集它所拥有的关系,并在该fit被删除时删除任何关系。但是,当我删除fit B时,从技术上讲,它没有任何与它作为孩子链接的fit。所以它永远不会删除它们


我想一个解决方法是将B是其子项的拟合指定给虚拟属性,以便它也被删除。或者在应用程序的中间层进行某种类型的后处理。将返回结果,尽管我仍然欢迎任何想法。=)

我明白了。正如在对OP的编辑中所述,我只需创建一个与交换的标准的新关系。这样,在删除配合时,将加载和删除两个关系:

mapper(Fit, fits_table,
   properties = {
                 "_Fit__projectedFits" : relation(Fit,
                                                  primaryjoin = projectedFits_table.c.victimID == fits_table.c.ID,
                                                  secondaryjoin = fits_table.c.ID == projectedFits_table.c.sourceID,
                                                  secondary = projectedFits_table,
                                                  collection_class = HandledProjectedFitList),

                 "_Fit__projectedOnto" : relation(Fit,
                                                  primaryjoin = fits_table.c.ID == projectedFits_table.c.sourceID,
                                                  secondaryjoin = fits_table.c.ID == projectedFits_table.c.victimID == fits_table.c.ID,
                                                  secondary = projectedFits_table,
                                                  collection_class = HandledProjectedFitList)

你试了什么?哎呀,谢谢你让我知道。我的尝试增加了