Skip to main content
 首页 » 编程设计

python之如何级联删除到 SqlAlchemy 中的多个表

2025年05月04日8duanxz

我有一个表,其中包含多个我想要级联删除的相关表。我在级联太远时遇到了问题。一些代码将有助于解释。

class Map(Base): 
    .... 
    #One to many relationship between the Map and Tile. 
    #Each Map is made up of many tiles 
    tiles = relationship('Tile', lazy='joined', backref='map', 
                          cascade="all, delete") 
 
class Tile(Base): 
    .... 
    #Reference to Map class. 
    map_id = Column(Integer, 
                ForeignKey('maps.id'), 
                nullable=False) 
 
    #Reference to graphics for this tile 
    #This is a many to one relationship, each Graphic is used by many Tiles 
    graphics_id = Column(Integer, 
                     ForeignKey("graphics.id"), 
                     nullable=False) 
 
    graphics = relationship("Graphic", uselist=False) 
 
class Graphic(Base): 
    .... 
    #Nothing special here 

问题是,当我删除 Map Graphics 时,它也会被删除,这不是我想要的。 我认为这与级联有关。

我该如何解决这个问题,以便删除 Map 类将删除 Tiles 而不是 Graphics?

请您参考如下方法:

您的代码(除非省略了一些细节)应该按预期工作:
不应删除图形。从relationship可以看出,默认的 cascade 参数是 save-update, merge,如果你要删除一个 Map<,它不应该触发 delete/.

要进行测试,请创建一个创建Map、Tile 和Graphic 的例程;然后删除 Map 并检查 Graphic 是否被删除 - 我不希望发生这种情况。如果猜想是正确的,那么你的 Graphic 对象必须被删除,因为一些其他的 relationship。

我指的是 SA 版本 0.64,但我相信默认配置在早期版本中也没有什么不同。