• Flask入门数据库的查询集与过滤器(十一)


    1 查询集 : 指数据查询的集合

    1. 原始查询集: 不经过任何过滤返回的结果为原始查询集
    2. 数据查询集: 将原始查询集经过条件的筛选最终返回的结果

    查询过滤器:

    过滤器 功能
    cls.query.filter(类名.属性名 条件操作符 条件) 过滤特定条件,返回的是query对象
    cls.query.filter_by(关键字参数对) 单条件查询,条件必须关键字参数,而且and连接
    cls.query.offset(num)/查询集对象.offset(num) 针对filter查询集对象偏移
    cls.query.limit(num) 针对查询集取两条数据
    cls.query.order_by(属性名).limit(num)
    cls.query.order_by( -属性名).limit(num)
    按属性名排序,取limit(num) 升序排列
    按属性名排序,取limit(num) 降序排列
    cls.query.groupby() 原查询分组,返回新查询

    查询执行函数

    查询执行方法 说明
    cls.query.all() 所有的数据查询集,返回对象列表,不能链式调用
    cls.query.first() 取第一个
    cls.query.get(值) User.query.get(10) 取得id的值对应的数据
    cls.query.filter().count() 返回查询结果数量
    cls.query.filter().paginate() 返回paginate对象,此对象用于分页
    cls.query.filter(类名.属性名.like('%值%')) like模糊查询
    cls.query.filter(类名.属性名.contains('值')) contains包含某个值
    cls.query.filter(User.username.startswith('张')) startswith 以...开头/endswith以...结尾
    cls.query.filter(User.id.in_([list])) in_ 和 not in 是否包含某个范围内
    cls.query.filter(User.id.is_(None)) is_ isnot 查询为null/不为null 的数据

    2 查询过滤器实例

    (1) all() 得到所有的数据查询集 返回列表

    类名.query.all() 不能够链式调用

    @view.route('/all/')
    def all():
        data = User.query.all()
        print(data)
        return '删除数据'
    
    (2) filter() 过滤默认查询所有

    类名.query.filter()

    类名.query.filter(类名.属性名 条件操作符 条件)

    #filter 获取所有数据查询集
    @view.route('/filter/')
    def filter():
        # data = User.query.filter()
        # data = User.query.filter(User.username=='王五')
        data = User.query.filter(User.username=='王五',User.sex==False)
        print(data)
        for i in data:
            print(i.username,i.sex)
        return '删除数据'
    
    (3) filter_by() 单条件查询
    @view.route('/filter_by/')
    def filter_by():
        # data = User.query.filter_by()
        data = User.query.filter_by(age=18)
        #只能为下面这种关键字的用法   且多个添加为and操作
        # data = User.query.filter_by(username='王五',sex=False)
    
    (4) offset(num) 偏移量
    @view.route('/offset/')
    def offset():
        # data = User.query.filter().offset(1)
        # data = User.query.filter().offset(2)
        #错误的用法
        data = User.query.all().offset(2)
        # print(User.query.filter())
        # print(data)
        # for i in data:
        #     print(i.username,i.sex)
        return '删除数据'
    
    (5) limit() 取值
    @view.route('/offsetlimit/')
    def offsetlimit():
        data = User.query.offset(2).limit(2)
        print(data)
        for i in data:
            print(i.username,i.sex)
        return 'limit'
    
    (6) order_by() 排序
    1. 默认升序
    2. -属性名
    @view.route('/orderby/')
    def orderby():
        #升序
        data = User.query.order_by(User.age).limit(1)
        #降序
        data = User.query.order_by(-User.age).limit(1)
    

    3 查询执行函数

    (1) first() 取出一条数据
    @view.route('/first/')
    def first():
        # data = User.query.first() == User.query.get(1)
        # data = User.query.order_by(-User.age).first()
        data = User.query.order_by(User.age).first()
        print(data.age)
        print(data.username)
        # for i in data:
        #     print(i.username,i.sex)
    
    (2) get() 取得id值的数据

    查询成功 返回 对象

    查询失败 返回 None

    data = User.query.get(10)  #找到id=10的数据
    print(data)
    
    (3) contains 包含关系

    类名.query.filter(类名.属性名.contains('值'))

    data = User.query.filter(User.username.contains('五'))
    
    (4) like 模糊查询

    类名.query.filter(类名.属性名.like('%值%'))

    data = User.query.filter(User.username.like('%张%')) #包含张
    data = User.query.filter(User.username.like('%张'))	#以张作为结尾	
    data = User.query.filter(User.username.like('张%'))	#以张作为开头
    
    (5) startswith 以...开头 endswith以...结尾
    data = User.query.filter(User.username.startswith('张')) #以 张作为开头
    data = User.query.filter(User.username.endswith('张'))	#以张作为结尾
    
    (6) 比较运算符
    1. __gt__ 大于
    2. __ge__ 大于等于
    3. __lt__ 小于
    4. __le__ 小于等于
    5. >   <
    6. >=  <=
    7. !=   ==
    
    data = User.query.filter(User.id>1) #查询id大于1的数据
    data = User.query.filter(User.id.__gt__(1)) #查询id大于1的数据
    data = User.query.filter(User.id.__ge__(1)) #查询id大于1的数据
    data = User.query.filter(User.id>=1) #查询id大于1的数据
    data = User.query.filter(User.id<3) #查询id大于1的数据
    data = User.query.filter(User.id.__lt__(3)) #查询id大于1的数据
    
    (7) in_ 和 not in 是否包含某个范围内
    #in的使用
    @view.route('/in/')
    def myin():
        data = User.query.filter(User.id.in_([1,2,3,4])) #在...范围内
        data = User.query.filter(~User.id.in_([1,2,3,4])) #not in不再...范围内
        data = User.query.filter(User.username.in_(['张三','王五']))
        return render_template('show.html',data=data)
    
    (8) is_ / isnot 查询为null/不为null 的数据
    #对于null数据的处理
    @view.route('/null/')
    def null():
        #查询为null数据的
        data = User.query.filter(User.username.is_(None))
        data = User.query.filter(User.username == None)
        data = User.query.filter(~User.username.isnot(None))
        #查询不为null数据的
        data = User.query.filter(~User.username.is_(None))
        data = User.query.filter(User.username.isnot(None))
        data = User.query.filter(User.username != None)
        
        return render_template('show.html',data=data)
    
    (9) count 统计
    @view.route('/count/')
    def mycount():
        #统计性别为sex的数据条数
        data = User.query.filter(not_(User.sex == True)).count()
        #统计所有数据的条数
        data = User.query.filter().count()
        data = User.query.count()
        return '{}条数据'.format(data)
    

    4 数据库逻辑查询

    from sqlalchemy import and_,or_,not_
    
    (1) 逻辑与 and_
    #逻辑操作
    @view.route('/and/')
    def myand():
        data = User.query.filter(User.sex==True,User.age<20)
        data = User.query.filter(User.sex==True).filter(User.age<20)
        data = User.query.filter(and_(User.sex==True,User.age<20))
        return render_template('show.html',data=data)
    
    (2) 逻辑或 or_
    #逻辑操作
    @view.route('/or/')
    def myor():
        #or
        data = User.query.filter(or_(User.sex==True,User.age<20),User.id.in_([1,2,3]))
        #and 和 or的 一起使用
        data = User.query.filter(or_(User.sex==True,User.age<20))
        return render_template('show.html',data=data)
    
    (3) 逻辑非 not_
    #逻辑操作
    @view.route('/not/')
    def mynot():
        data = User.query.filter(not_(User.sex==True))
        #错误写法只能有一个条件
        data = User.query.filter(not_(User.sex==True,User.id!=1))
        data = User.query.filter(~User.sex==True)
        return render_template('show.html',data=data)
    

    5 flask-migrate 文件的迁移

    安装

    1. flask-script
    2. flask-migrate

    使用

    from flask_migrate import Migrate,MigrateCommand
    migrate = Migrate(app,db)   #将app与db进行关联
    manager = Manager(app)
    manager.add_command('db',MigrateCommand) #给manage添加迁移文件的命令db
    
    (1) 生成迁移文件目录

    python3 manage.py db init

    生成 一个 migrations的迁移文件目录

    (2) 生成迁移文件

    python3 manage.py db migrate

    (3) 执行迁移文件

    python3 manage.py db upgrade

  • 相关阅读:
    C# 灵活切换开发/测试/生成环境web.config
    c# sqlserver 删除大批量数据超时
    vue 上传进度显示
    sqlserver the name is not a valid identifier error in function
    WEBAPI 设置上传文件大小
    vue 获取视频时长
    webapi 导入excel处理数据
    vscode 通过ftp发布vue到azure服务器
    C# 汉字转拼音
    静态代码扫描工具
  • 原文地址:https://www.cnblogs.com/why957/p/9151011.html
Copyright © 2020-2023  润新知