繁体   English   中英

级联删除自指多对多关系

[英]Cascade delete from self-referential many-to-many relationship

我有一个带有下表的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在源列或受害者列中的所有行。

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

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,它确实会删除该关系。

我以为我只是在想这完全错误。 当我有一个fit实例时,它会收集它拥有的关系,并在删除该fit时删除所有实例。 但是,当我删除拟合B时,从技术上讲,它没有作为子级链接到它的任何拟合。 因此,它永远不会删除它们。

我猜一种解决方法是将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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM