Flask SQLAlchemy

 

2022-02-16

查询

基础查询

  • ==all()==:返回包含所有查询记录的列表
  • ==first()==:返回查询的第一条记录,如未找到,返回 None
  • ==get(id)==:传入主键作为参数,如未找到,返回 None
  • ==count()==:返回查询结果的数量
  • ==first_or_404()==:返回查询结果的第一条记录,如果未找到,返回 404
  • ==get_or_404(id)==:传入主键作为参数,如未找到,返回 404
  • ==paginate()==:返回第一个 Pagination 对象,可对记录进行分页处理
1
# User 为对应模型类
2
3
# 获取 User 第一条记录
4
User.query.first()
5
User.query.first().name # 读取 name 的值
6
7
# User 所有记录
8
User.query.all() # 返回:[<User 1>, <User 2>]
9
10
# 指定数量
11
User.query.limit(42).all()
12
13
# 获取指定键值
14
User.query.get(42) # 返回 <User 1>
15
16
# 获取记录数
17
User.query.count()

过滤

  • ==filter()==:使用指定过滤规则,并返回查询对象
  • ==filter_by()==:使用指定过滤规则(以关键字表达式形式)
  • ==order_by()==:根据指定条件对记录进行排序
  • ==group_by()==:指定条件对记录进行分组
1
# 返回 name 等于 immwind 的第一条记录
2
User.query.filter_by(name='immwind').first()
3
User.query.fileter(User.name='immwind').first() # 同上
4
5
# 排序
6
User.query.order_by(User.name).all()
7
8
# 模糊查询
9
User.query.filter(User.name.like('%吴%')).all()
10
11
# 使用 getattr 可传递表类和列名
12
User.query.filter(getattr(User, column).like(f'%{}%')).all()
13
14
# in 查询
15
User.query.filter(User.id.in_([42, 13]))
16
17
# not in
18
User.query.filter(~User.id.in_([42, 13]))

逻辑

1
from sqlchemy import and_ or_
2
# 需导入模块
3
4
# and 查询
5
User.query.filter(User.query.filter(and_(User.name == 'immwind',User.id==42)))
6
User.query.filter(User.name == 'immwind', User.id == 42) #同上
7
8
# or 查询
9
ser.query.filter(or_(User.name == 'immwind', User.age == 42))

原生查询

1
from sqlalchemy import text
2
3
# 原生 SQL 语句
4
User.query.from_statement(text("select * from tags where id=:value")).params(value=42)

转 JSON

1
def to_json(obj):
2
_dict = vars(obj)
3
for i in list(_dict.keys()):
4
if i.startswith('_'):
5
_dict.pop(i)
6
return _dict
7
8
data = json.dumps(<data_list>, default=to_json)
9
print(jsonify(data))

参考