Как я могу каскадно удалить несколько таблиц в SqlAlchemy? - PullRequest
2 голосов
/ 09 сентября 2010

У меня есть таблица с несколькими зависимыми таблицами, которые я хочу каскадно удалить. У меня проблемы с каскадом слишком далеко. Некоторый код поможет объяснить.

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

Проблема в том, что при удалении карты также удаляется графика, а это не то, что мне нужно Я предполагаю, что это связано с каскадом.

Как мне это исправить, чтобы при удалении класса карты были удалены плитки, но не графика?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2010

Я получил его, изменив

graphics = relationship("Graphic", uselist=False)

до

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

Я не уверен, что это идеальный ответ, но он работает.

0 голосов
/ 10 сентября 2010

Ваш код (если не указаны некоторые детали) должен работать так, как вы ожидаете, :
Графика не должна быть удалена. Как видно из отношения , параметром cascade по умолчанию является save-update, merge, который не должен вызывать delete при удалении Map.

.

Для проверки создайте подпрограмму, которая создает Map, a Tile and a Graphic; затем удалите Map и проверьте, удаляется ли Графика - я не ожидаю, что это произойдет. Если гипотеза верна, то ваш Graphic объект должен быть удален из-за какого-то другого relationship.

Я имею в виду SA версии 0.64, но я считаю, что конфигурация по умолчанию не отличалась и в более ранней версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...