2016-11-22 8 views
3

をロードすることは可能です、私は関連メンバーを持ってTRANSACTIONLOGモデルを、持っています。この関係は表に列をppl_id参照TRANSACTIONLOGテーブルのtlog_ppl_id列によって定義される(テーブルはメンバーが含まれています)。は、それがモデルでSQLAlchemyの外部キーを記入し、それがSQLAlchemyのでは関連オブジェクト

新しいTransactionlogオブジェクトがあるとします。 メンバーオブジェクトをロードして(Mと呼ぶことができます)、T.mem​​ber = Mに設定すると、T.mem​​berにアクセスでき、リンクされたメンバーが返されます。

私がしたいのは、新しいトランザクションログSQLAlchemyオブジェクトTを用意し、tlog_ppl_idプロパティに有効な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')) 

を私は(フラスコSQLAlchemyのを使用していない)をフラスコの下でのPython 3.5.1にSQLAlchemyの1.0.14を使用してい

+0

[現在の外部キー値に基づいてSQLAlchemyに関係を設定することはできますか?](https://stackoverflow.com/questions/23160775/can-i-get-sqlalchemy-to-populate-a -relationship-on-the-current-foreign-key) –

答えて

0

私が正しく理解したら、load_on_pendingを探しているかもしれませんが、その使用はお勧めしません:

ORMが正常に使用されている場合は、load_on_pendingフラグは動作を改善しません。オブジェクト参照は、外部キーレベルではなくオブジェクトレベルで構築する必要があり、フラッシュが行われる前に通常の方法で存在する必要があります。このフラグは一般的な使用のためのものではありません。それは単に任意の読み込みを行うことはできませんのでごtest関数内のすべてのすべての新しく作成されたTインスタンスは、関連Peopleインスタンスを印刷しようとする前に、セッションに追加されていないことを

は注意(一部の魔法は遊びである場合を除きとすべての新しいモデルインスタンスがデフォルトのセッションに追加されます)。

ここで私はあなたが本当にだけではなく、外部キーのオブジェクトインスタンスを使用すべきだと思うけれどもあなたはおそらく、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> 

しかしお勧めは、私はZen of Pythonが、この場合に適用されると思います

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

アプローチはインスタンスではなく、外部キーを使用することです

明示的なものは暗黙的なものよりも優れています。

e.e.e.外部キーを設定した後に暗黙的な参照に頼るのではなく、関連するオブジェクトを明示的に照会します。

+1

ありがとうございました。これは正しいことですが、SQLalchemyの作業方法をより良く一致させるために、関連するオブジェクトとの作業方法を変更しました。 –

関連する問題