sqlalchemy каскадные и ассоциативные объекты

Структура моей базы данных примерно такая (я использую декларативный стиль):

class Character(Base):
    __tablename__="characters"
    id = Column(Integer, primary_key=True)
    name = Column(String)
    player = Column(String)
    inventory = relation(Inventory)

class Item(Base):
    __tablename__="items"
    id = Column(Integer, primary_key=True)
    name = Column(String)

class Inventory(Base):
    __tablename__="inventory"
    id = Column(Integer, primary_key=True)
    char_id = Column(Integer, ForeignKey("characters.id"))
    item_id = Column(Integer, ForeignKey("characters.id"))
    quantity = Column(Integer)
    item = relation(Item)

Моя проблема в том, что когда я удаляю объект «Инвентарь» из «Character.inventory», он не обновляется до тех пор, пока сеанс не будет зафиксирован. Например:

>>> torch_inv=character.inventory[0] # Inventory object referred to a torch
>>> torch_inv.item, torch_inv.quantity
(<Item object, torch>, 3)
>>> session.delete(torch_inv)
>>> character.inventory[0]
<Inventory object, torch>

Я видел, что есть вариант отношения «каскад», но я не могу найти способ заставить его работать в этом случае.


person pygabriel    schedule 04.01.2010    source источник
comment
(item_id ссылается на characters.id?)   -  person bobince    schedule 04.01.2010


Ответы (1)


Session.delete() просто помечает экземпляр как «подлежащий удалению», поэтому ваше отношение не изменится, пока вы не сбросите изменения в базу данных независимо от каскадных правил. С другой стороны, вы можете просто удалить экземпляр Inventory из коллекции character.inventory, тогда правило каскадирования 'delete-orphan' пометит удаленный экземпляр Inventory для удаления.

person Denis Otkidach    schedule 04.01.2010
comment
Большое спасибо, это проясняет мне роль опции каскада, которую я неправильно понял :). - person pygabriel; 04.01.2010