2013-11-15 115 views
1

我有一個基本的一對多的關係:SQLAlchemy的外鍵懶加載

class Term(Base): 
    __tablename__ = 'term' 
    id = Column(Integer, primary_key=True) 

class Node(Base): 
    __tablename__ = 'node' 
    id = Column(Integer, primary_key=True) 
    term = Column(Integer, ForeignKey('term.id')) 

但是當我加載Node對象,訪問「術語」的財產,我剛剛得到的數字單詞ID,沒有期限目的。

node = session.query(Node).filter(Node.id == 1).one() 
print node.term # 123 

如何獲得外鍵字段以延遲加載對象?

非常感謝。 本

回答

1

因爲你term屬性是Column,SQLAlchemy的映射它作爲列的值。你可以SQLAlchemy的使用relationship實際加載指涉行:

from sqlalchemy.orm import relationship 

class Term(Base): 
    __tablename__ = 'term' 
    id = Column(Integer, primary_key=True) 

class Node(Base): 
    __tablename__ = 'node' 
    id = Column(Integer, primary_key=True) 
    term = Column(Integer, ForeignKey('term.id')) 
    related_term = relationship(Term, backref="nodes") 

因爲my_node.related_term看起來有點古怪,我傾向於選擇具有柱的命名約定叫table_column,而不是僅僅table,讓我可以還要在表格後面命名relationship屬性,而不是發明其他一些奇怪的名稱。

+0

輝煌。這種排序,我也會使用該命名提示。非常感謝。 –

0

使用的node.term返回值一個新的查詢,以獲得相關對象:

node = session.query(Node).filter(Node.id == 1).one() 
related_term = session.query(Term).filter(Term.id == node.term).one() 
+0

這與Ben所要求的完全相反,明確加載這個對象很大程度上否定了使用ORM的價值,在這種情況下,您可以忽略數據的磁盤持久性並將它們視爲常規python對象。 – SingleNegationElimination

+0

非常感謝,我幾乎是SQLAlchemy的新手哈哈。向你學習會很有趣,先生! – aIKid