web-dev-qa-db-ja.com

Flask-SQLAlchemyのbackref関数とbackrefパラメーター

Flask-SQLAlchemyでは、relationshipメソッドのbackrefパラメーターを使用すると、 docs の例に示すように、指定されたクラスで新しいプロパティを宣言できます。

class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    addresses = db.relationship('Address', backref='person', lazy='dynamic')

class Address(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50))
    person_id = db.Column(db.Integer, db.ForeignKey('person.id'))

ただし、backref関数もあります。

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    addresses = db.relationship('Address',
                                backref=db.backref('person', lazy='joined'), 
                                lazy='dynamic')

この場合、特に複数のbackref定義で、backrefパラメーターに渡されるlazy関数の役割は何ですか? backref='person'とどう違うのですか?

8
kentwait

From Flaskモデル のドキュメント:

backrefは、Addressクラスで新しいプロパティを宣言する簡単な方法です。次に、my_address.personを使用して、そのアドレスの人に連絡することもできます。 lazyは、SQLAlchemyがデータベースからデータをロードするタイミングを定義します。

select(デフォルト)は、SQLAlchemyが標準のselectステートメントを使用して必要に応じて一度にデータをロードすることを意味します。

joinedは、JOINステートメントを使用して、親と同じクエリでリレーションシップをロードするようにSQLAlchemyに指示します。

subqueryは 'joined'のように機能しますが、代わりにSQLAlchemyはサブクエリを使用します。

dynamicは、アイテムが多い場合に特別で便利です。アイテムをロードする代わりに、SQLAlchemyは別のクエリオブジェクトを返します。これは、アイテムをロードする前にさらに絞り込むことができます。これは通常、この関係に一握り以上のアイテムを期待する場合に必要なものです。

5
Ricky Han

2番目のレイジーは、backrefのレイジーステータスを定義します。例えば:

addresss = db.relationship( 'Address'、backref = db.backref( 'person'、lazy = 'joined')、lazy = 'dynamic')

lazy = 'joined'は 'person'のレイジーステータスを定義しますlazy = 'dynamic'はアドレスのレイジーステータスを定義します