数据的查询
在控制器文件中导入需要的模型类
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对象