63

私はSQLAlchemyの初心者で、2つの方法でクエリを実行できることがわかりました:

アプローチ 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(...)

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

4

3 に答える 3

16

上記のコードでは、違いはありません。これは、最初の例の 3 行目で次のようになっているためです。

  • queryプロパティは明示的にバインドされていますDBSession
  • Queryに渡されたカスタム オブジェクトがありませんquery_property

@petr-viktorin が回答 hereで指摘しているように、最初の例でモデルを定義する前に、セッションが利用可能である必要があります。これは、アプリケーションの構造によっては問題になる可能性があります。

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

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

于 2013-01-28T00:25:57.017 に答える
5

別の SQLAlchemy の質問に対する回答 (ここ) が役立つ場合があります。その答えは次のように始まります。

が割り当てられているModel.queryため、を使用できます。この場合、は と同等です。ModelSession.query_propertyModel.querySession.query(Model)

于 2015-09-09T09:47:17.087 に答える
3

これらの欠点は次のquery_propertyとおりです。

  • 構成したセッションとは異なるセッションで使用することはできません (ただし、その場合はいつでも使用できますsession.query)。
  • スキーマを定義する前に、使用可能なセッション オブジェクトが必要です。

たとえば、テストを書きたいときに、これらはあなたを苦しめる可能性があります。

また、session.querySQLAlchemy の仕組みによりよく適合します。query_property便宜上 (または他のシステムとの類似性?) のために追加されているように見えます。に固執することをお勧めしますsession.query

于 2013-01-27T22:59:16.060 に答える