对于flask的插入分为三步走的情况:
1:创建python 对象;也就是与数据库映射的那个类
2:将对象添加到session里面去(这里的session是flask_sqlalchemy的session)
3:将session提交
# 1:
user1 = User(name='blerli')
user2 = User(name='blerli2')
#2:
db.session.add(user1)
db.session.add(user2)
#或者是直接用db.session.add_all([use1,user2])
#3
db.session.commit()
对于django的插入,也可以按照以下步骤理解:
1:创建python对象
2:对象保存
# 1:
user1 = User()
user1.name = 'blerli1'
user2= User()
user2.name = 'blerli2'
#2:
user1.save()
user2.save()
User.objects.create(name='bluesli')
在说删除了更新操作之前需要先说查询操作:
因为orm的动作都是在后面,你需要查询到了数据之后再修改;
不像sql语句:delete from table_name where id =id
User.query.all()返回一个list
User.query.first()返回记录的第一条
User.objects.all()
User.objects.first()
这里有一个不同的是flask是一个list,而django是QuerySet通过all查询出来的东西
在django中objects是一个mange的管理对象,是models和数据库的接口,
flask也可以这么理解;
User.objects.filter().exclude().[all(),firest()] ;exclude:排除的意思,就是不包含查询参数匹配到的结果;
So how do we get data back out of our database? For this purpose Flask-SQLAlchemy provides a query
attribute on your Model
class. When you access it you will get back a new query object over all records. You can then use methods like filter()
to filter the records before you fire the select with all()
or first()
. If you want to go by primary key you can also use get()
.
大致意思就是通过提供query属性来进行查询;在用all(),或者是first()触发查询之前你可以通过filter或者是filter_by来过滤,如果你想通过主键来查询,你可以用get的方式;
此处应该注意filter_by和filter的区别;一般filter _by只支持一般的列查询,不支持比较运算符,但是filter更强大,支持比较运算符和支持or_、in_等语法;
User.query.filter(name='bluesli').all()
当然还有更多,这里参考了这个博客:
原文:https://blog.csdn.net/weixin_41829272/article/details/80609968
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
(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)
__exact 精确等于 like ‘aaa’
__iexact 精确等于 忽略大小写 ilike ‘aaa’
__icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以…开头
__istartswith 以…开头 忽略大小写
__endswith 以…结尾
__iendswith 以…结尾,忽略大小写
__range 在…范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False __isnull=True 与 __exact=None的区别
flask中get只能查询primary_key
对于django:get只能查询结果只有一个的操作;最好是通过primary_key来查询,对是否是主键没有限制;可以添加字段条件
但是对于flask通过get就必须要用primary_key来获取;不然会查询不到;不可以加字段条件
flask:
User.query.filter(),[all(),first()].delete()
db.sesssion.commit()
django:
User.objects.filter().[all(),firest()].delete()
这个都可以拆分为两步,先查询之后在删除
1:查询:
p = User.query.filter().all()
2:删除
p.delete()
db.session.commit()
django同上,少了commit,query改为了objects;
都是遵循的两步:
1:查询,
p = User.query.filter().first()
2:更改
p.name='bluelsi'
db.commit()
都是遵循的两步:
1:查询,
p = User.objects.filter().first()
2:更改
p.name='bluelsi'