2012-09-10 2 views
24

私はSQLAlchemyの初心者だとクエリが2の方法で行うことができますが見つかりました:SQLAlchemyのModel.queryとsession.query(Model)の違いは何ですか?

アプローチ1:

DBSession = scoped_session(sessionmaker()) 
class _Base(object): 
    query = DBSession.query_property() 

Base = declarative_base(cls=_Base) 

class SomeModel(Base): 
    key = Column(Unicode, primary_key=True) 
    value = Column(Unicode) 

# When querying 
result = SomeModel.query.filter(...) 

アプローチ2

DBSession = scoped_session(sessionmaker()) 
Base = declarative_base() 

class SomeModel(Base): 
    key = Column(Unicode, primary_key=True) 
    value = Column(Unicode) 

# When querying 
session = DBSession() 
result = session.query(SomeModel).filter(...) 

は、それらの間のいずれかの違いはありますか?

答えて

1

私はquery_propetyにこれらの欠点を参照してください。

  • あなたは(あなたは常に、その後session.queryを使用することができますが)あなたが設定したものとは別のセッションでそれを使用することはできません。
  • スキーマを定義する前に、セッションオブジェクトが必要です。

たとえば、テストを書きたいときにこれらの問題が発生する可能性があります。

また、session.queryは、SQLAlchemyの動作方法に適しています。 query_propertyは、便宜上、または他のシステムとの類似性のために上に追加されたようです。 session.queryにこだわることをお勧めします。

8

上記のコードでは、違いはありません。最初の例の3行目では、これはされていますqueryプロパティが明示的にDBSession

  • にバインドされている

    • @のペトル・viktorinポイントとしてquery_property

    に渡さ一切カスタムQueryオブジェクトがありませんanswer hereでは、最初の例でモデルを定義する前にセッションが利用可能である必要があります。これは、アプリケーションの構造によっては問題があります。

    ただし、すべてのクエリに追加のクエリパラメータを自動的に追加するカスタムクエリが必要な場合は、最初の例のみが可能です。 sqlalchemy.orm.query.Queryから継承するカスタムクエリクラスは、引数としてquery_propertyに渡すことができます。 This questionはそのパターンの例を示しています。

    モデルオブジェクトにカスタムクエリプロパティが定義されていても、2番目の例の最後の行のように、このプロパティはsession.queryでクエリするときには使用されません。つまり、最初の例のように、カスタムクエリクラスが必要な場合は唯一のオプションです。

  • 1

    別のSQLAlchemy質問への回答(here)が役に立ちます。その答えはで始まる:

    Model(または通常はその基底クラス、特に宣言型の拡張が使用されている場合には)Sesssion.query_propertyが割り当てられているためあなたは、Model.queryを使用することができます。この場合、Model.querySession.query(Model)に相当します。