2012-06-26 112 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

不,不起作用。由於關係不會被插入數據庫,重新選擇它不會改變任何東西,我想。 –