What's the difference between Model.query and session.query(Model) in SQLAlchemy?
I'm a beginner in SQLAlchemy and found query can be done in 2 method:
Approach 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(...)
Approach 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(...)
Is there any difference between them?
In the code above, there is no difference. This is because, in line 3 of the first example:
- the
query
property is explicitly bound toDBSession
- there is no custom
Query
object passed toquery_property
As @petr-viktorin points out in the answer here, there must be a session available before you define your model in the first example, which might be problematic depending on the structure of your application.
If, however, you need a custom query that adds additional query parameters automatically to all queries, then only the first example will allow that. A custom query class that inherits from sqlalchemy.orm.query.Query
can be passed as an argument to query_property
. This question shows an example of that pattern.
Even if a model object has a custom query property defined on it, that property is not used when querying with session.query
, as in the last line in the second example. This means something like the first example the only option if you need a custom query class.
An answer (here) to a different SQLAlchemy question might help. That answer starts with:
You can use
Model.query
, because theModel
(or usually its base class, especially in cases where declarative extension is used) is assignedSession.query_property
. In this case theModel.query
is equivalent toSession.query(Model)
.