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

前言

SQLAlchemy的包使用文档
SQLAlchemy Documentation


这里有跟select相搭配使用的各种方法嘞

上一篇:模型(model)Flask-SQLAlchemy的使用,在这里已经分享了安装以及初步使用SQLAlchemy包。在实际项目中,经常有搜索的功能,这里就分享一下模糊查询的使用

一、filter、filter_by实现过滤查询

1、filter_by()

在文档中可以看到,filter_by()的使用方式
在这里插入图片描述
找到源码可以看到实现逻辑:

    def filter_by(self, **kwargs: Any) -> Self:
        from_entity = self._filter_by_zero()

        clauses = [
            _entity_namespace_key(from_entity, key) == value
            for key, value in kwargs.items()
        ]
        return self.filter(*clauses)

可以看出,filter_by() 只接受键值对参数,所以 filter_by() 不支持><(大于和小于)和 and_、or_查询

基础查询

查询文章类型相等的

    resource_lists: List[models.Resource] = (models.Resource.query
                                             .filter_by(r_type=0 )
                                             .all())
并且查询(多条件查询)
# 获取所有博客文章列表
@blog_base_blueprint.route('/search_reousrce', methods=['POST'])
def search_resource():
    keyword = request.form.get('keyword')
    type= request.form.get('type')

    if not keyword or type:
        return jsonify({
            'code': 0,
            'msg': '搜索词/类型不能为空',
        })


    resource_lists: List[models.Resource] = (models.Resource.query
                                             .filter_by(r_type=0 )
                                             .filter_by(title = keyword)
                                             .all())

    return jsonify({
        'code': 0,
        'msg': 'success',
        'data': {
            "resource_list": [resource.to_format() for resource in resource_lists]
        }
    })

若是或者条件查询,filter_by()方法就不满足不了需求了,需要使用filter()

2、filter()

like:模糊查询

查询标题包含特定词的

keyword = request.form.get('keyword')
resource_lists: List[models.Resource] = (models.Resource.query
                                             .filter(models.Resource.title.like('%{}%'.format(keyword) ))
                                             .all())
and:并且查询
  • 链式调用多个filter条件,每个filter都会在之前的结果集上进行筛选。那并且查询就好处理了,比如:我要查询标题中含有某些关键词并且内容类型为医学文献的:
def search_resource():
    keyword = request.form.get('keyword')
    type= request.form.get('type')
    resource_lists: List[models.Resource] = (models.Resource.query
                                             .filter(models.Resource.title.like('%{}%'.format(keyword) ))
                                             .filter(models.Resource.r_type==type)
                                             .all())
  • 使用sqlalchemy中的and_实现
from sqlalchemy import and_
def search_resource():
    keyword = request.form.get('keyword')
    type= request.form.get('type')
    resource_lists: List[models.Resource] = (models.Resource.query
                                             .filter(and_(models.Resource.title.like('%{}%'.format(keyword) ), models.Resource.r_type==type))
                                             .all())
or:或者查询

查询挑剔中含有特定关键词的,或者内容类型为医学指南的:

from sqlalchemy import or_

def search_resource():
    keyword = request.form.get('keyword')
    type= request.form.get('type')

    if not keyword :
        return jsonify({
            'code': 0,
            'msg': '搜索词/类型不能为空',
        })

    resource_lists: List[models.Resource] = (models.Resource.query
                                             .filter(or_(models.Resource.title.like('%{}%'.format(keyword) ), models.Resource.r_type==type))
                                             .all())

    return jsonify({
        'code': 0,
        'msg': 'success',
        'data': {
            "resource_list": [resource.to_format() for resource in resource_lists]
        }
    })

二、all(),first(),get()的使用

#获取所有的数据
    models.Resource.query.all()

#获取第一条数据
    models.Resource.query.first()
    
#需要传递参数,查询数据的主键跟参数一样
    models.Resource.query.get(3)

三、分页和排序

分页

#跟php差不多,都是使用offset和limit,下面意思是跳过第二条开始查询,然后获取3条记录
 models.Resource.query.offset(2).limit(3)

排序

#使用order_by方法排序,有desc和asc排序方式,直接可用
   models.Resource.query.order_by(models.Resource.id.desc()).all()

四、聚合查询(count、sum、avg)

	resource_lists =db.session.query(func.count(models.Resource.id)).all()

    print(resource_lists)
    print(resource_lists[0][0])

打印resource_lists可以发现返回值是这样的:
在这里插入图片描述
所以想获取到最终的值需要如上方式处理一下,类似的还有方法sum()、avg()

五、关系查询(一对一,一对多)

这个等到有时间再写一篇吧,我要去当码农啦

相关推荐

  1. Oracle数据库条件查询模糊查询排序(四)

    2024-04-03 11:44:03       37 阅读
  2. thinkphp:数据库条件查询

    2024-04-03 11:44:03       26 阅读
  3. 数据库查询--条件查询

    2024-04-03 11:44:03       34 阅读
  4. sql语句条件查询模糊查询

    2024-04-03 11:44:03       54 阅读
  5. JPA构建条件查询

    2024-04-03 11:44:03       59 阅读
  6. elasticsearch之条件查询

    2024-04-03 11:44:03       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-03 11:44:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-03 11:44:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-03 11:44:03       82 阅读
  4. Python语言-面向对象

    2024-04-03 11:44:03       91 阅读

热门阅读

  1. 搜索引擎-02-分词与全文索引

    2024-04-03 11:44:03       29 阅读
  2. Python | PyCharm 键盘快捷键

    2024-04-03 11:44:03       32 阅读
  3. jvm高级面试题-2024

    2024-04-03 11:44:03       46 阅读
  4. Mini-React

    2024-04-03 11:44:03       46 阅读
  5. 数据库嵌套事务的实现

    2024-04-03 11:44:03       34 阅读
  6. 设计模式(15):迭代器模式

    2024-04-03 11:44:03       33 阅读
  7. 建造者模式:构建复杂对象的优雅之道

    2024-04-03 11:44:03       37 阅读
  8. 堆积排序算法C代码

    2024-04-03 11:44:03       42 阅读
  9. 5分钟安装docker和docker compose环境

    2024-04-03 11:44:03       34 阅读
  10. 微信小程序-语音输入(录音并播放)

    2024-04-03 11:44:03       39 阅读
  11. STC8H8K64U 学习笔记 - 位运算

    2024-04-03 11:44:03       34 阅读