Flask Python:模糊查询filter和filter_by,数据库多条件查询

打印 上一主题 下一主题

主题 951|帖子 951|积分 2853

前言

  SQLAlchemy的包使用文档
SQLAlchemy Documentation

这里有跟select相搭配使用的各种方法嘞
上一篇:模型(model)Flask-SQLAlchemy的使用,在这里已经分享了安装以及初步使用SQLAlchemy包。在实际项目中,常常有搜索的功能,这里就分享一下模糊查询的使用
一、filter、filter_by实现过滤查询

1、filter_by()

在文档中可以看到,filter_by()的使用方式

找到源码可以看到实现逻辑:
  1.     def filter_by(self, **kwargs: Any) -> Self:
  2.         from_entity = self._filter_by_zero()
  3.         clauses = [
  4.             _entity_namespace_key(from_entity, key) == value
  5.             for key, value in kwargs.items()
  6.         ]
  7.         return self.filter(*clauses)
复制代码
可以看出,filter_by() 只继承键值对参数,所以 filter_by() 不支持><(大于和小于)和 and_、or_查询
基础查询

查询文章类型相等的
  1.     resource_lists: List[models.Resource] = (models.Resource.query
  2.                                              .filter_by(r_type=0 )
  3.                                              .all())
复制代码
并且查询(多条件查询)

  1. # 获取所有博客文章列表
  2. @blog_base_blueprint.route('/search_reousrce', methods=['POST'])
  3. def search_resource():
  4.     keyword = request.form.get('keyword')
  5.     type= request.form.get('type')
  6.     if not keyword or type:
  7.         return jsonify({
  8.             'code': 0,
  9.             'msg': '搜索词/类型不能为空',
  10.         })
  11.     resource_lists: List[models.Resource] = (models.Resource.query
  12.                                              .filter_by(r_type=0 )
  13.                                              .filter_by(title = keyword)
  14.                                              .all())
  15.     return jsonify({
  16.         'code': 0,
  17.         'msg': 'success',
  18.         'data': {
  19.             "resource_list": [resource.to_format() for resource in resource_lists]
  20.         }
  21.     })
复制代码
假如大概条件查询,filter_by()方法就不满意不了需求了,需要使用filter()
2、filter()

like:模糊查询

查询标题包罗特定词的
  1. keyword = request.form.get('keyword')
  2. resource_lists: List[models.Resource] = (models.Resource.query
  3.                                              .filter(models.Resource.title.like('%{}%'.format(keyword) ))
  4.                                              .all())
复制代码
and:并且查询



  • 链式调用多个filter条件,每个filter都会在之前的结果集上举行筛选。那并且查询就好处理了,比如:我要查询标题中含有某些关键词并且内容类型为医学文献的:
  1. def search_resource():
  2.     keyword = request.form.get('keyword')
  3.     type= request.form.get('type')
  4.     resource_lists: List[models.Resource] = (models.Resource.query
  5.                                              .filter(models.Resource.title.like('%{}%'.format(keyword) ))
  6.                                              .filter(models.Resource.r_type==type)
  7.                                              .all())
复制代码


  • 使用sqlalchemy中的and_实现
  1. from sqlalchemy import and_
  2. def search_resource():
  3.     keyword = request.form.get('keyword')
  4.     type= request.form.get('type')
  5.     resource_lists: List[models.Resource] = (models.Resource.query
  6.                                              .filter(and_(models.Resource.title.like('%{}%'.format(keyword) ), models.Resource.r_type==type))
  7.                                              .all())
复制代码
or:大概查询

查询挑剔中含有特定关键词的,大概内容类型为医学指南的:
  1. from sqlalchemy import or_
  2. def search_resource():
  3.     keyword = request.form.get('keyword')
  4.     type= request.form.get('type')
  5.     if not keyword :
  6.         return jsonify({
  7.             'code': 0,
  8.             'msg': '搜索词/类型不能为空',
  9.         })
  10.     resource_lists: List[models.Resource] = (models.Resource.query
  11.                                              .filter(or_(models.Resource.title.like('%{}%'.format(keyword) ), models.Resource.r_type==type))
  12.                                              .all())
  13.     return jsonify({
  14.         'code': 0,
  15.         'msg': 'success',
  16.         'data': {
  17.             "resource_list": [resource.to_format() for resource in resource_lists]
  18.         }
  19.     })
复制代码
二、all(),first(),get()的使用

  1. #获取所有的数据
  2.     models.Resource.query.all()
  3. #获取第一条数据
  4.     models.Resource.query.first()
  5.    
  6. #需要传递参数,查询数据的主键跟参数一样
  7.     models.Resource.query.get(3)
复制代码
三、分页和排序

分页

  1. #跟php差不多,都是使用offset和limit,下面意思是跳过第二条开始查询,然后获取3条记录
  2. models.Resource.query.offset(2).limit(3)
复制代码
这里有个常见的问题,就是TypeError: unsupported operand type(s) for -: ‘str‘ and ‘int‘,点击可以查察办理方案
排序

  1. #使用order_by方法排序,有desc和asc排序方式,直接可用
  2.    models.Resource.query.order_by(models.Resource.id.desc()).all()
复制代码
四、聚合查询(count、sum、avg)

  1.         resource_lists =db.session.query(func.count(models.Resource.id)).all()
  2.     print(resource_lists)
  3.     print(resource_lists[0][0])
复制代码
打印resource_lists可以发现返回值是这样的:

所以想获取到最终的值需要如上方式处理一下,类似的还有方法sum()、avg()
五、关系查询(一对一,一对多)

新开了一篇,Flas中模型关联实现,点击前往

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表