3

結合された継承テーブルからポリモーフィック ロードを作成しようとしています (Flask-Sqlalchemy を使用しています)。

class Sip(db.Model):
    id = db.Column(db.Integer, primety_key=True)
    identity = db.Column(db.String(10))
    __mapper_args__ = {'polymorphic_identity': 'sip', 'polymorphic_on': identity}

class Device(Sip):
    id = db.Column(db.Integer, db.ForeignKey('sip.id', ondelete='CASCADE'), primary_key=True)
    __mapper_args__ = {'polymorphic_identity': 'dev'}

class Line(Sip):
    id = db.Column(db.Integer, db.ForeignKey('sip.id', ondelete='CASCADE'), primary_key=True)
    __mapper_args__ = {'polymorphic_identity': 'line'}

Device オブジェクトと Line オブジェクトが 1 つずつあります。そのようなクエリを作成しようとすると:

Sip.query.with_polymorphic(Device).all()

すべてのオブジェクトを返します

[<myapp.models.Device at 0x45cfc50>, <myapp.models.Line at 0x45cfa90>]

の引数として Line を使用した場合と同じ状況ですwith_polymorphic()。テーブル「sip」には、必要なすべての ID が含まれています。確認できます。

>> Sip.query.with_polymorphic(Device).all()[0].identity
>> u'dev'
>> Sip.query.with_polymorphic(Device).all()[1].identity
>> u'line'

何が起こっているのかわかりません。すべてがドキュメントの例とまったく同じようです。ありがとう。

4

1 に答える 1

5

with_polymorphic タイプによってオブジェクトをフィルタリングするのではなく、最初のクエリ中に他のテーブルから取得する列を定義するだけです。with_polymorphicそのため、クエリで を使用せず、テーブルにLine格納されている属性の値を取得したい場合lines、SA は別のSQLステートメントを発行してデータベースから属性を取得します。

エンジンで有効にすると、用途echo=Trueに応じて異なる SQL ステートメントが生成されていることがわかります。with_polymorphic

  • 使用なし: クエリ中にテーブルの属性のみsipsがロードされます
  • with_polymorphic(Device)devices:テーブルの属性もロード​​します ( LEFT JOINs を使用)
  • with_polymorphic("*"): 同じクエリ内のすべてのサブクラスの属性を読み込みます。

このトピックの詳細については、照会するテーブルの基本的な制御を参照してください。

于 2013-06-05T10:15:20.073 に答える