2016-11-22 23 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的工作方式。 –

相关问题