如何在SqlAlchemy中将删除级联到多个表?

时间:2010-09-09 18:46:04

标签: python orm sqlalchemy

我有一个表有几个依赖表,我想要级联删除。我遇到了太多级联的问题。一些代码将有助于解释。

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?

2 个答案:

答案 0 :(得分:0)

您的代码(除非某些细节被省略)应该按预期工作
不应删除图形。从relationship可以看出,默认cascade参数为save-update, merge,如果您要删除delete,则不应触发Map

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

我指的是SA版本0.64,但我认为默认配置在早期版本中也没有区别。

答案 1 :(得分:0)

我通过改变

来实现它
graphics = relationship("Graphic", uselist=False)

graphics = relationship("Graphic", uselist=False, lazy='joined',
        backref=backref('tiles', cascade="all, delete, delete-orphan"))

我不确定这是完美的答案,但它确实有效。