我有一个表有几个依赖表,我想要级联删除。我遇到了太多级联的问题。一些代码将有助于解释。
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?
答案 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"))
我不确定这是完美的答案,但它确实有效。