Reputation: 903
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?
Upvotes: 72
Views: 37391
Reputation: 1646
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)
.
Upvotes: 6
Reputation: 66970
I see these downsides to query_property
:
session.query
then).These could bite you when you want to write tests, for example.
Also, session.query
fits better with how SQLAlchemy works; query_property
looks like it's just added on top for convenience (or similarity with other systems?).
I'd recommend you stick to session.query
.
Upvotes: 8
Reputation: 1562
In the code above, there is no difference. This is because, in line 3 of the first example:
query
property is explicitly bound to DBSession
Query
object passed to query_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.
Upvotes: 21