flask和django区别--数据库增删改查的区别

flask和django都是一样的,在你创建了数据模型之后,两个框架都会给你数据库操作的api,供你使用;(create retrieve update delete)

假设我们有一个User类

增加(插入):

对于flask的插入分为三步走的情况:

1:创建python 对象;也就是与数据库映射的那个类

2:将对象添加到session里面去(这里的session是flask_sqlalchemy的session)

3:将session提交

flask:

# 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:

对于django的插入,也可以按照以下步骤理解:

1:创建python对象

2:对象保存

# 1:

user1 = User()

user1.name  = 'blerli1'

user2= User()

user2.name = 'blerli2'

#2:

user1.save()

user2.save()

还有一个直接的操作就是create:

User.objects.create(name='bluesli')

 

 

查询操作:

在说删除了更新操作之前需要先说查询操作:

因为orm的动作都是在后面,你需要查询到了数据之后再修改;

不像sql语句:delete from table_name where id =id

简单的查询:

flask:

User.query.all()返回一个list

User.query.first()返回记录的第一条

django:

User.objects.all()

User.objects.first()

这里有一个不同的是flask是一个list,而django是QuerySet通过all查询出来的东西

在django中objects是一个mange的管理对象,是models和数据库的接口,

flask也可以这么理解;

django中查询的基本套路是:

User.objects.filter().exclude().[all(),firest()] ;exclude:排除的意思,就是不包含查询参数匹配到的结果;

flask的基本套路:User.query.[filter(),filter_by()].[all(),first()]

 

条件查询:

flask:

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)
 

django:

__exact 精确等于 like ‘aaa’

__iexact 精确等于 忽略大小写 ilike ‘aaa’

__contains 包含 like ‘%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的区别

get区别:

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()

基本一样的但是flask有一个db.session.commit()操作;

这个都可以拆分为两步,先查询之后在删除

1:查询:

p = User.query.filter().all()

2:删除

p.delete()

db.session.commit()

django同上,少了commit,query改为了objects;

 

更新操作:

flask:

都是遵循的两步:

1:查询,

p = User.query.filter().first()

2:更改

p.name='bluelsi'

db.commit()

django:

都是遵循的两步:

1:查询,

p = User.objects.filter().first()

2:更改

p.name='bluelsi'

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(flask_django)