SQLAlchemy 级联和关联对象

0 投票
1 回答
981 浏览
提问于 2025-04-15 17:37

我的数据库结构大概是这样的(我使用的是声明式风格):

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)

我的问题是,当我从“角色”的“库存”中移除一个“库存”对象时,这个变化不会立即更新,直到会话被提交。例如:

>>> 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>

我看到有一个关系选项叫“级联”,但是我找不到在这种情况下让它工作的办法。

1 个回答

1

Session.delete() 方法只是把一个实例标记为“待删除”,所以在你把更改保存到数据库之前,你的关系不会改变,这和级联规则无关。另一方面,你可以直接从 character.inventory 集合中移除 Inventory 实例,这样如果你设置了 'delete-orphan' 级联规则,移除的 Inventory 实例就会被标记为删除。

撰写回答