Flask入门数据库的查询集与过滤器(十一)
1 查询集 : 指数据查询的集合
- 原始查询集: 不经过任何过滤返回的结果为原始查询集
- 数据查询集: 将原始查询集经过条件的筛选最终返回的结果
查询过滤器:
| 过滤器 | 功能 |
|---|---|
| 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() 排序
- 默认升序
- -属性名
@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 文件的迁移
安装:
flask-scriptflask-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
Flask入门数据库的查询集与过滤器(十一)的更多相关文章
- Flask入门数据库框架flask-SQLAlchemy(十)
Web程序开发中最重要的莫过于关系型数据库,即SQL 数据库,另外文档数据库(如 mongodb).键值对数据库(如 redis)慢慢变得流行. 原因 : 我们不直接使用这些数据库引擎提供的 Py ...
- django查询集-17
当查询结果是多个的时候,django-ORM会返回一个 查询集(QuerySet) ,表示从数据库中获取对象的 集合 . 查询集可以使用过滤器进行再次处理. 例如查询阅读量大于20且评论数大于30的书 ...
- django-数据库的查询集
1.curd(增删改查) 对于数据库,作为一名开发人员并不会感到陌生,那么数据库中的查询集是怎么一回事呢? 2.数据库的查询集 查询集这个概念存在django框架中,存在于ORM(object rel ...
- Django框架(六):模型(二) 字段查询、查询集
1. 字段查询 通过模型类.objects属性可以调用如下函数,实现对模型类对应的数据表的查询. 函数名 功能 返回值 说明 get 返回表中满足条件的一条且只能有一条数据. 返回值是一个模型类对象. ...
- django 过滤器-查询集-比较运算符-FQ对象-mysql的命令窗口
""" 返回查询集的方法称为过滤器 all() 返回查询集中所有数据 filter() 返回符合条件的数据 一.filter(键=值) 二.filter(键=值,键=值) ...
- 查询集API -- Django从入门到精通系列教程
该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...
- flask再学习-思考之怎么从数据库中查询数据在页面展示!
看别人视频觉得很简单,要自己做蒙蔽了!这样子.NO! 1. 流程: 首先要有和数据库连接的驱动!一般有PYMySQL mysqlclient 等 使用扩展Flask-SQLAlchemy 获得orm对 ...
- OceanBase数据库实践入门——手动搭建OceanBase集群
前言 目前有关OceanBase功能.案例.故事的文章已经很多,对OceanBase感兴趣的朋友都想安装一个数据库试试.本文就是分享初学者如何手动搭建一个OceanBase集群.这也是学习理解Ocea ...
- Neo4j:图数据库GraphDB(一)入门和基本查询语句
图数据库的代表:Neo4j 官网: http://neo4j.com/ 引言:为什么使用图数据库 在很多新型项目中,应用图数据库已经是势在必行的趋势了,因为图数据库可以很好的表示各种节点与关系的概念 ...
随机推荐
- andriod导入v4包导致的错误
最近升级android studio到版本3.0.1后,想要使用FragmentActivity这个类,导入v4包,发现R文件报错了,也就是找不到的意思. 如图:导包 此时选中v4包导进去. 确定之后 ...
- c# BackGroundWorker 多线程操作的小例子 (转)
在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...
- 浅谈App原生开发、混合开发及HTML5开发的优劣
App混合开发(英文名:Hybrid App),是指在开发一款App产品的时候为了提高效率.节省成本即利用了原生的开发技术还应用了HTML5开发技术,是原生和HTML5技术的混合应用.目前App的开发 ...
- drag与drop事件
为了支持网页上一些元素的拖动效果,可以使用drag和drog事件. 目前ie 5.0+, firefox 3.5+等都支持这些事件,ECMA Script第5版正式将其纳入标准. 对于被拖动的元素来说 ...
- CVE-2014-0321漏洞成因分析
1. 简介 最近在补之前落下的想学的东西,古河之前已经在微薄里面公布了此漏洞的poc及利用思路,不过在看古河的文章前我先独立分析一下其漏洞成因,记录下自己的分析流程. 2. 实验环境 操作系统:Win ...
- Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等
本课主题 Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系 Spark Worke ...
- My SQL 和SQL Server区别
MySQL 与SQL Server区别 今天了解了二者区别,整理网上查阅资料,总结列举如下: MSSQL == SQL server 是sybase与微软合作时期的产物. 对于程序开发人员而言,目前使 ...
- 如何玩转Android远控(androrat)
关于WebView中接口隐患与手机挂马利用的引深 看我是怎样改造Android远程控制工具AndroRat 1.修改布局界面 2.配置默认远程ip和端口 3.LauncherActivity修改为运行 ...
- [原]如何在Android用FFmpeg+SDL2.0之同步视频
关于视频同步的原理可以参考http://dranger.com/ffmpeg/tutorial05.html 和 [原]基础学习视频解码之同步视频 这两篇文章,本文是在这两篇的基础上移植到了Andro ...
- Python Django 分页
Python Django 分页 http://www.360doc.com/content/14/0721/17/16044571_396090985.shtml