Python 级联删除自引用多对多关系
我有一个包含以下表的SQLite数据库: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),
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)
你试了什么?哎呀,谢谢你让我知道。我的尝试增加了