1. 程式人生 > >flask和django區別--資料庫增刪改查的區別

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'