我有一个包含以下表格的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是子项的拟合分配给虚拟属性,以便它也被删除。或者在应用程序的中间层进行某种后期处理。将回复结果,但我仍然欢迎任何想法。 =)
答案 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)