2016-11-22 45 views
3

在SQLAlchemy中,我有一個transactionlog模型,具有相關成員。這種關係是通過在transactionlog表tlog_ppl_id列,引用在ppl_id列定義(在表包含成員)。是否有可能填補模型中的SQLAlchemy的外鍵,並將它加載相關對象

假設我有一個新的Transactionlog對象T. 如果我加載一個成員對象(讓它叫M),並設置T.mem​​ber = M,我可以訪問T.mem​​ber並返回我的鏈接成員。

我想要做的是使用我的新事務日誌SQLAlchemy對象T,並用有效的ppl_id填充tlog_ppl_id屬性。 我這樣做後,我想訪問T.mem​​ber,並讓SQLAlchemy從數據庫中加載相關的人員記錄。但它不這樣做,它返回

所以我想知道是否有可能讓SQLAlchemy用特定的指令加載相關的對象,如果我只填充對象的外鍵列?在模型

def test(): 
    from app.models.data import Transactionlog 
    T = Transactionlog() 
    T.tlog_ppl_id = '2433A992-B8C7-4780-91DE-67D12C517C55' 
    print(T.member) 
    return "" 

代碼:

代碼來測試此

class Transactionlog(transactionlog): 
    """ 
    Transactionlog model class. 
    """ 

    member = relationship("People", backref=backref('transactions')) 

我關於Python 3.5.1使用的SQLAlchemy 1.0.14下燒瓶(不使用燒瓶-SQLAlchemy的)

+0

可能重複的[我可以通過SQLAlchemy來填充基於當前外鍵值的關係嗎?](https://stackoverflow.com/questions/23160775/can-i-get-sqlalchemy-to-populate-a - 基於關係的當前外鍵) –

回答

0

如果我理解正確的話,那麼你可能會尋找load_on_pending,但不鼓勵使用:

當ORM正常使用時,load_on_pending標誌不會改善行爲 - 對象引用應該在對象級別而不是外鍵級別構建,以便在刷新進行前以普通方式存在。該標誌不適用於一般用途。

注意,所有的一切在你的test功能嘗試打印相關People實例之前新創建的T實例未添加到會話,所以它根本無法做任何負載(除非一些神奇的是,在遊戲和所有新模型實例都添加到某個默認會話中)。

這裏有一個如何你也許可以使用load_on_pending選項有點演示,但我覺得你真的應該只使用實例對象,而不是外鍵:

In [8]: class A(Base): 
    ...:  __tablename__ = 'a' 
    ...:  a_id = Column(Integer, primary_key=True) 

In [9]: class B(Base): 
    ...:  __tablename__ = 'b' 
    ...:  b_id = Column(Integer, primary_key=True, autoincrement=True) 
    ...:  a_id = Column(Integer, ForeignKey('a.a_id')) 
    ...:  a = relationship('A', load_on_pending=True) 

In [10]: class C(Base): 
    ...:  __tablename__ = 'c' 
    ...:  C_id = Column(Integer, primary_key=True, autoincrement=True) 
    ...:  a_id = Column(Integer, ForeignKey('a.a_id')) 
    ...:  a = relationship('A') 

In [16]: session.add(A(a_id=1)) 

In [17]: session.commit() 

In [18]: b = B() 

In [19]: session.add(b) 

In [20]: b.a_id = 1 

In [21]: b.a 
Out[21]: <__main__.A at 0x7ff32388ab70> 

In [22]: session.rollback() 

In [23]: c = C() 

In [25]: session.add(c) 

In [26]: c.a_id = 1 

In [27]: c.a 

In [28]: session.commit() 

In [29]: c.a 
Out[29]: <__main__.A at 0x7ff32388ab70> 

但是,如前所述,推薦方法是使用實​​例,而不是外鍵:

# Will look the instance up in the session's identity map, if present 
T.member = session.query(People).get('2433...') 

我認爲Zen of Python適用於這種情況:

顯式優於隱式。

I.e.在設置外鍵之後顯式查詢待關聯對象而不是依賴隱式查找。

+1

謝謝。這是對的,我們改變了與相關對象合作的方式,以更好地匹配SQLalchemy的工作方式。 –

相關問題