![](/img/trans.png)
[英]Sqlalchemy: self-referential many-to-many relationship with extra column in relationship table
[英]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.