我有两个关系到同一张桌子。当我向一个关系添加元素时,在我提交会话之前,这不会反映到其他关系。有没有办法强制“更新”关系?
具体示例:
class Event(ManagerBase):
"""Defines an event."""
__tablename__ = 'eventing_events'
id = Column(Integer, primary_key=True)
device_id = Column(Integer, ForeignKey(EventingDevice.id), nullable=False)
device = relation(EventingDevice)
type_id = Column(Integer, ForeignKey(EventType.id), nullable=False)
type = relation(EventType)
datetime = Column(DateTime, nullable=False)
summary = Column(String(500))
fields = relation("EventFieldValue",
viewonly=True,
collection_class=attribute_mapped_collection("field.name"))
class EventFieldValue(ManagerBase):
"""The value of a single field of an event."""
__tablename__ = 'eventing_event_field_values'
event_id = Column(Integer, ForeignKey(Event.id), primary_key=True)
event = relation(Event, backref=backref("field_values",
collection_class=attribute_mapped_collection("field")))
field_id = Column(Integer, ForeignKey(Field.id), primary_key=True)
field = relation(Field)
value = Column(Text)
我有Event
到EventFieldValue
的两个问题:fields
和field_values
(通过事件的backref)。当我向event.field_values
添加一个EventFieldValue时,在我提交会话之前它不会反映在event.fields
中。
答案 0 :(得分:2)
因为你有两个关系,sqlalchemy必须为每个关系发出请求,并且不会在会话中共享他们的缓存。
你应该看看Association proxies,这似乎正是你所需要的。它们允许您只定义一个关系,并将代理放在它们的顶部,以便更容易地访问关系中的内容。
答案 1 :(得分:0)
Flushing会话应该解决这个问题。它使用所有新状态更新您的会话,但不执行提交。您还可以查看将重新加载对象的Refresh/Expire。