具有声明性ORM扩展的Flask SQL Alchemy

时间:2017-01-16 20:26:47

标签: python flask sqlalchemy

我在Flask项目中使用sqlalchemy ORM和声明扩展来获取Web API。 Flask文档显示了如何在端点here

内正确执行查询

现在这一切都很好,但是如果我想通过查询执行一个组会怎么样呢。例如,给出flask文档中的用户域对象:

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(50), unique=True)
    email = Column(String(120), unique=True)

我想为所有具有相同名称的用户检索id的总和(没有意义,为了简单起见,将其作为玩具示例!)。 在纯SQL中,我可以轻松地使用:

select name, sum(id) from user group by name

然而,在端点内部,执行查询的重新思考方式(再次see here)是从ref开始到域对象User,例如:

User.query.filter(User.name == 'admin').first()

要执行分组查询,我宁愿使用类似这样的东西(确实有效!):

#see database module http://flask.pocoo.org/docs/0.12/patterns/sqlalchemy/#declarative)
from database import db_session 

 @app.route('/')
 def index():
     db_session.query(func.sum(User.id).label('num_id'), User.name).group_by(User.name).all()

在这种情况下,查询从db_session开始。 这是正确和安全的吗?记住我们在Flask中的并发应用程序。

任何帮助?

1 个答案:

答案 0 :(得分:0)

没关系。 但我经常使用。with_entities(*entities)来处理这种情况:

User.query.filter(filters).with_entities(User.name.label('name'), func.count(User.id).label('count')).group_by(User.name)