级联从自引用多对多关系中删除

时间:2014-05-01 02:16:00

标签: 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),
                         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相关联的关系表。

我一直在试图找出级联删除的正确方法,但我无法让它工作。我想如果删除Fit,那么它还会删除关系表中适合ID位于源列或受害者列中的任何行。

编辑:我忘了添加我尝试过的级联标记。

cascade='all, delete, delete-orphan', single_parent=True, - 没有用。在面部,手动删除关系行也删除了父(无论与sourceID匹配)

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

cascade='all, delete', single_parent=True, - 与上述相同

编辑2: 我一直在摆弄它,并且没有添加cascade属性,它有点起作用。让我解释一下:

如果我将Fit B链接到Fit A(在这种情况下A是父级),则删除Fit B,它不会删除该关系。但是,如果我删除了适合的A,它会删除该关系。

我假设我一直在考虑这个完全错误。当我有一个适合的实例时,它会收集它所拥有的关系,并在删除该适合时删除任何实例。但是,当我删除适合B时,它在技术上没有任何与它作为子项链接的拟合。所以它永远不会删除它们。

我想解决方法是将B是子项的拟合分配给虚拟属性,以便它也被删除。或者在应用程序的中间层进行某种后期处理。将回复结果,但我仍然欢迎任何想法。 =)

1 个答案:

答案 0 :(得分:0)

我明白了。正如在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)