SQLAlchemy,一对多列表总是在提交后删除一个对象

时间:2016-03-29 15:28:51

标签: python sqlalchemy

以下是我如何定义我的篮子,以及多个“项目”关系:

class Basket(Base):
 __tablename__ = 'basket'
 id             = Column(Integer, primary_key=True)
 items_id       = Column(Integer, ForeignKey('item.id'))
 items          = relationship("Item", uselist=True)

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

但是当我测试它时,对于某些存在,在会话提交之后,我的basket.items只保留一个项目。如果我再添加一些,然后再次提交,我的列表将保留一个。

我不明白为什么。这是我的测试:

>>> basket = Basket()
>>> s = session()
>>> s.add(basket)
>>> banana = Item(name="banana")
>>> orange = Item(name="orange") 
>>> s.add(banana)
>>> s.add(orange)
>>> s.commit()
>>> basket.items.append(banana)
>>> basket.items.append(orange)
>>> basket.items
[<database.declarative.Item object at 0x10e4c7790>, <database.declarative.Item object at 0x10e4c7810>]
>>> s.commit()
>>> basket.items
[<database.declarative.Item object at 0x10e4c7810>]

2 个答案:

答案 0 :(得分:1)

您的配置指定了从BasketItem的多对一关系,因为它使用外键Basket.item_id。您只能在该列上拥有一个ID,因此即使您指定Item,您也只能在Basket.items中拥有一个uselist=True

对此进行建模的正确方法是将外键放在Item上:

class Basket(Base):
    ...
    items          = relationship("Item")

class Item(Base):
    ...
    basket_id = Column(Integer, ForeignKey(Basket.id))

答案 1 :(得分:-1)

s.commit()可能正在释放整个会话。你想要刷新,然后最后提交。

s.flush()