2016-12-27 7 views
0

私はテーブル間の結合を行うためにそれを読んだだけで、関係を定義する必要があります。sqlalchemy relashionshipは暗黙的に結合を誘導する

私はこれをたとえば受け入れられた回答hereで読んでいます。通常、どの列を決定するために2つのテーブル間の外部キー関係を調べることにより、2つのテーブル間の結合を作成します)の関係が 関係を(参加方法の設定


しかし、ドキュメンテーションhereから私は次の引用を見つけました比較されるべきである。

だから今、私は自分自身を尋ねる質問がある:私は関係を定義した場合
、私は暗黙結合を持って理解し、なぜ人々は別の明示を行っているが与えられたものを除い参加しますか?

答えて

1

joinの関係を定義する必要はありません。 relationshipはマップされたクラスの間にあります。つまり、ORMの概念です。関連するオブジェクトなどのコレクションを持つオブジェクトがあります。結合は、明示的なSQLが必要なときです。

リレーションシップを定義しても、SQL JOIN節の暗黙的な結合は得られません。これは、既定では遅延であるためです。一方で、関係が関係するオブジェクトをどのように読み込むのか、そして例えば熱心なものを使用するjoinedloadconfigureにすることができます。

なぜ、誰かがリレーションシップがあっても明示的な結合を使用する理由は、リレーションシップとの結合が必要な集計のようなサーバー側の操作は実行できません。一方、あなたはそれを必要とせず、ORMに完全に満足しているかもしれません。

答えでは、関係にリンクされているため、結合には必要ありません。ターゲットエンティティ(または選択可能)に参加するには、2つの間に外部キー関係が必要です。たとえば、次のように

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

In [4]: class B(Base): 
    ...:  id = Column(Integer, primary_key=True) 
    ...:  a_id = Column(Integer, ForeignKey('a.id')) 
    ...:  __tablename__ = 'b' 
    ...:  

In [6]: print(session.query(B).join(A)) 
SELECT b.id AS b_id, b.a_id AS b_a_id 
FROM b JOIN a ON a.id = b.a_id 

関与なしORMの関係定義。

関連する問題