Querying with function on Flask-SQLAlchemy model gives BaseQuery object is not callable error
Question:
I want to query services between two dates and sum their prices. When I try to use func.sum
with Services.query
, I get TypeError: BaseQuery object is not callable
. How do I query using a function with Flask-SQLAlchemy?
Services.query(func.sum(Services.price)).filter(Services.dateAdd.between(start, end))
Answers:
Model.query
is a shortcut to db.session.query(Model)
, it’s not callable. If you’re not querying a model, continue to use db.session.query(...)
as you would with regular SQLAlchemy.
db.session.query(db.func.sum(Services.price)).filter(
Services.dateAdd.between(start, end)
)
fwiw after this long time, you can use Flask-SQLAlchemy syntax by using:
Services.query(func.sum(Services.price)).filter(Services.dateAdd.between(start, end)).scalar() # or you can use .scalar() ; .one() ; .first() ; .all() depending on what you want to achieve
Basically, syntax Model.query(...).filter(...)
needs to end with what you want to get. This is what is missing from your query generating the error.
I want to query services between two dates and sum their prices. When I try to use func.sum
with Services.query
, I get TypeError: BaseQuery object is not callable
. How do I query using a function with Flask-SQLAlchemy?
Services.query(func.sum(Services.price)).filter(Services.dateAdd.between(start, end))
Model.query
is a shortcut to db.session.query(Model)
, it’s not callable. If you’re not querying a model, continue to use db.session.query(...)
as you would with regular SQLAlchemy.
db.session.query(db.func.sum(Services.price)).filter(
Services.dateAdd.between(start, end)
)
fwiw after this long time, you can use Flask-SQLAlchemy syntax by using:
Services.query(func.sum(Services.price)).filter(Services.dateAdd.between(start, end)).scalar() # or you can use .scalar() ; .one() ; .first() ; .all() depending on what you want to achieve
Basically, syntax Model.query(...).filter(...)
needs to end with what you want to get. This is what is missing from your query generating the error.