查询

基础查询

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

过滤

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

逻辑

from sqlchemy import and_ or_
# 需导入模块
 
# and 查询
User.query.filter(User.query.filter(and_(User.name == 'immwind',User.id==42)))
User.query.filter(User.name == 'immwind', User.id == 42) #同上
 
# or 查询
ser.query.filter(or_(User.name == 'immwind', User.age == 42))

原生查询

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

转 JSON

def to_json(obj):
    _dict = vars(obj)
    for i in list(_dict.keys()):
    if i.startswith('_'):
    _dict.pop(i)
    return _dict
 
data = json.dumps(<data_list>, default=to_json)
print(jsonify(data))

参考