数据的查询

python flask
创建于:2019年06月22日

在控制器文件中导入需要的模型类

from app.admin.model.User import User

Flask-SQLAlchemy 在 Model 类上提供了 query 属性。当访问它时,会得到一个新的所有记录的查询对象。在使用 all() 或者 first() 发起查询之前可以使用方法 filter() 来过滤记录。如果想要用主键查询的话,也可以使用 get()。

user = User.query.filter_by(username='admin').first()

查找一条不存在的数据返回None

使用更复杂的表达式查询一些用户:

User.query.filter(User.username.endswith('@example.com')).all()

按某种规则对用户排序:

User.query.order_by(User.username).all()

限制返回用户的数量:

User.query.limit(1).all()

用主键查询用户:

User.query.get(1)

获取数量

User.query.count()

在视图中查询
当编写 Flask 视图函数,对于不存在的条目返回一个 404 错误是非常方便的。因为这是一个很常见的问题,Flask-SQLAlchemy 为了解决这个问题提供了一个帮助函数。可以使用 get_or_404() 来代替 get(),使用 first_or_404() 来代替 first()。这样会抛出一个 404 错误,而不是返回 None:

@admin.route('/user/<username>')
def show_user(username):
    user = User.query.filter_by(username=username).first_or_404()
    return render_template('show_user.html', user=user)

模糊查询

User.query.filter(User.name.like('xxx%'))

in查询

User.query.filter(User.id.in_([5,6]))

not in查询

User.query.filter(~User.id.in_([1,5,6]))

and查询

# 需要先导入模块
from sqlchemy import and_

User.query.filter(and_(User.name == 'Python',User.id==2))
#或者
User.query.filter(User.name == 'Python', User.id == 2)

or查询


from sqlalchemy import or_

User.query.filter(or_(User.name == 'Python', User.name == 'Flask'))

原生查询

from sqlalchemy import text

User.query.filter(text('id>=:value1 and id <:value2')).params(value1=2,value2=5)

完整sql语句查询

User.query.from_statement(text("select * from tags where id=:value")).params(value=1)

原生查询数据数量

db.session.execute("SELECT COUNT(*) FROM table").scalar()

group by统计数据

from sqlalchemy import func

db.session.query(Model).with_entities(Model.field, func.count(Model.field)).group_by(field).all()

返回json格式数据

首先定义处理模型对象的函数

def to_json(obj):
    _dict = vars(obj)
    for i in list(_dict.keys()):
    if i.startswith('_'):
    _dict.pop(i)
    return _dict

使用json模块,json模块的dumps方法可以传入default参数自定义序列化处理方法

from flask import jsonify
import json

user = User.get(1)
data = json.dumps(user, default=to_json)
return jsonify(data)#返回json对象