在控制器文件中导入需要的模型类
~~~
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查询
~~~
query.filter(Tags.id.in_([5,6]))
~~~
not in查询
~~~
query.filter(~Tags.id.in_([1,5,6]))
~~~
and查询
~~~
from sqlchemy import and_
query.filter(and_(Tags.name == 'Python',Tags.id==2))
~~~
或者
~~~
query.filter(Tags.name == 'Python', Tags.id == 2)
~~~
or查询
~~~
from sqlalchemy import or_
query.filter(or_(Tags.name == 'Python', Tags.name == 'Flask'))
~~~
原生查询
~~~
from sqlalchemy import text
query.filter(text('id>=:value1 and id <:value2')).params(value1=2,value2=5)
~~~
完整sql语句查询
~~~
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()
~~~
#### <font color=red>注:如果想返回json格式数据,需要把查询出来的结果处理后在返回</font>
首先定义处理模型对象的函数
~~~
def to_json(obj):
_dict = vars(obj)
for i in list(_dict.keys()):
if i.startswith('_'):
_dict.pop(i)
return _dict
~~~
1. 使用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对象
~~~
2. 直接在模型类中定义处理方法
~~~
class User(db.Model):
.
.
.
def obj_json(self):
return to_json(self)
~~~