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() 不能够链式调用

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

类名.query.filter()

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

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

3 查询执行函数

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

查询成功 返回 对象

查询失败 返回 None

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

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

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

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

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

4 数据库逻辑查询

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

5 flask-migrate 文件的迁移

安装

  1. flask-script
  2. flask-migrate

使用

  1. from flask_migrate import Migrate,MigrateCommand
  2. migrate = Migrate(app,db) #将app与db进行关联
  3. manager = Manager(app)
  4. 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

Flask入门数据库的查询集与过滤器(十一)的更多相关文章

  1. Flask入门数据库框架flask-SQLAlchemy(十)

    ​ Web程序开发中最重要的莫过于关系型数据库,即SQL 数据库,另外文档数据库(如 mongodb).键值对数据库(如 redis)慢慢变得流行. 原因 : 我们不直接使用这些数据库引擎提供的 Py ...

  2. django查询集-17

    当查询结果是多个的时候,django-ORM会返回一个 查询集(QuerySet) ,表示从数据库中获取对象的 集合 . 查询集可以使用过滤器进行再次处理. 例如查询阅读量大于20且评论数大于30的书 ...

  3. django-数据库的查询集

    1.curd(增删改查) 对于数据库,作为一名开发人员并不会感到陌生,那么数据库中的查询集是怎么一回事呢? 2.数据库的查询集 查询集这个概念存在django框架中,存在于ORM(object rel ...

  4. Django框架(六):模型(二) 字段查询、查询集

    1. 字段查询 通过模型类.objects属性可以调用如下函数,实现对模型类对应的数据表的查询. 函数名 功能 返回值 说明 get 返回表中满足条件的一条且只能有一条数据. 返回值是一个模型类对象. ...

  5. django 过滤器-查询集-比较运算符-FQ对象-mysql的命令窗口

    """ 返回查询集的方法称为过滤器 all() 返回查询集中所有数据 filter() 返回符合条件的数据 一.filter(键=值) 二.filter(键=值,键=值) ...

  6. 查询集API -- Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  7. flask再学习-思考之怎么从数据库中查询数据在页面展示!

    看别人视频觉得很简单,要自己做蒙蔽了!这样子.NO! 1. 流程: 首先要有和数据库连接的驱动!一般有PYMySQL mysqlclient 等 使用扩展Flask-SQLAlchemy 获得orm对 ...

  8. OceanBase数据库实践入门——手动搭建OceanBase集群

    前言 目前有关OceanBase功能.案例.故事的文章已经很多,对OceanBase感兴趣的朋友都想安装一个数据库试试.本文就是分享初学者如何手动搭建一个OceanBase集群.这也是学习理解Ocea ...

  9. Neo4j:图数据库GraphDB(一)入门和基本查询语句

    图数据库的代表:Neo4j 官网:  http://neo4j.com/ 引言:为什么使用图数据库 在很多新型项目中,应用图数据库已经是势在必行的趋势了,因为图数据库可以很好的表示各种节点与关系的概念 ...

随机推荐

  1. ArcEngnine中IHookHelper的用法

    一.IHookHelper 主要在用在自定义类型于AE带的的ICommand或ITool等 1.实例化IHookHelper 对象:IHookHelper m_hookHelper = new Hoo ...

  2. Android解析ActivityManagerService(二)ActivityTask和Activity栈管理

    前言 关于AMS,原计划是只写一篇文章来介绍,但是AMS功能繁多,一篇文章的篇幅远远不够.这一篇我们接着来学习与AMS相关的ActivityTask和Activity栈管理. 1.ActivitySt ...

  3. 实验三:klee的执行重现机制(示例分析)

    结论性内容: (1)如果是在程序中使用klee_make_symbolic,则可以使用下列脚本进行重现. export LD_LIBRARY_PATH=/home/klee/xiaojiework/k ...

  4. ubuntu下root不能复制 abc用户下的软连接文件

    使用root用户去复制,提示权限不足: 那么这个软连接是个什么东西??

  5. MUI实现上拉加载和下拉刷新

    编写存储过程分页(此处使用T-SQL) CREATE PROC [dbo].[Common_PageList] ( @tab nvarchar(max),---表名 @strFld nvarchar( ...

  6. laravel 使用EasyWechat 3分钟完成微信支付(以APP支付为例)

    上一篇写了支付宝支付,然后这段时间我又把微信支付给接上了,作为萌新的我还是很有成就感的,哈哈~~好了,该写正事了. 第一步:创建应用及配配置  首先到微信的官方平台注册应用https://pay.we ...

  7. liunx screen使用简单实验

    liunx screen使用 今天因工作需要使用到screen工具,感觉挺有意思,记录一下 GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件.用户可以通过该软件同时连接多个本地 ...

  8. 两种MVC框架比较

    基于Web的MVC framework在J2EE的世界内已是空前繁荣. TTS网站上几乎每隔一两个星期就会有新的MVC框架发布.目前比较好的MVC,老牌的有Struts.Webwork.新兴的MVC框 ...

  9. 在WAS下找不到主机名称的问题

    发生错误: 联合 ADMU0036E: Deployment Manager 不能根据名称主机 cdzfwas2 在地址 127.0.0.1 查找           期间发生错误:正在回滚到原始配置 ...

  10. 警告: Request method 'POST' not supported的原因之一

    警告: Request method 'POST' not supported是经常遇到的,这里记录一下我经常遇到的一种情况,以免忘记. 我使用拦截器拦截所有请求,然后列出不拦截的请求.有时候由于自己 ...