2012-06-26 116 views
1

我有两个关系到同一个表。当我将一个元素添加到一个关系中时,这不会反映到其他关系,直到我提交会话。有没有办法强制“更新”关系?更新SQLAlchemy关系

具体的例子:

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) 

我有两个realations从EventEventFieldValuefieldsfield_values(通过事件的backref)。当我添加一个EventFieldValue到event.field_values时,它不反映在event.fields中,直到我提交会话。

+0

你有没有试过'flush()'你的会话? –

回答

1

因为你有两个关系,sqlalchemy必须为每个请求提出请求,并且不会在会话中共享它们的缓存。

你应该看看Association proxies,这似乎正是你所需要的。它们允许您只定义一个关系,并将代理放置在它们的顶部,以更轻松地访问关系中的内容。

+0

我已经考虑过了,但是我没有找到任何方法在代理中使用集合类字典,而不是在关系本身中使用。你能想出这样的解决方案吗? –

+0

你真的需要从''Event''访问''EventFieldValue''吗,它不能像http://docs.sqlalchemy.org/en/latest/orm/extensions/associationproxy.html#代理到字典的集合或http://docs.sqlalchemy.org/en/latest/orm/extensions/associationproxy.html#composite-association-proxies? – madjar

+0

它可以被隐藏,但我希望'eventfieldvalue.field.name'作为'fields'和'eventfieldvalue.field'集合中的一个关键字,作为'field_values'集合中的关键字。 –

0

Flushing会议应该解决这个问题。它用所有新状态更新你的会话,但不做提交。你也可以看看Refresh/Expire这将重新加载你的对象。

+0

不,不起作用。由于关系不会被插入数据库,重新选择它不会改变任何东西,我想。 –