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?
What does the Session do? One of the core concepts in SQLAlchemy is the Session . A Session establishes and maintains all conversations between your program and the databases. It represents an intermediary zone for all the Python model objects you have loaded in it.
Model is a class within the Flask-SQLAlchemy project. Flask-SQLAlchemy makes it easier to use SQLAlchemy within a Flask application. SQLAlchemy is used to read, write, query and delete persistent data in a relational database through SQL or the object-relational mapper (ORM) interface built into the project.
It provides the interface where SELECT and other queries are made that will return and modify ORM-mapped objects.
delete() is invoked upon an object and the Session is flushed, the row is deleted from the database.
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.
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)
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With