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'