django惰性機制
所謂惰性機制:publisher.objects.all()或者.filter()等都只是返回了乙個queryset(查詢結果集物件),它並不會馬上執行sql,而是當呼叫queryset的時候才執行。
惰性機制之可迭代12
3# objs=models.book.objects.
all
() # [obj1,obj2,ob3...]
#
for
obj
in
objs: # 每一obj就是乙個行物件,此時會執行sql
# print(
"obj:"
,obj)
惰性機制之可切片12
34# objs=models.book.objects.
all
() # [obj1,obj2,ob3...]
# print(objs[1])
# print(objs[1:4])
# print(objs[::-1])
惰性機制之django快取問題
django有自己的快取,如果2次的obj物件一致,第二次的查值直接從快取中取值。注意1:如果2次操作之間有資料進行了修改 ,則需要重新從資料庫中查值,否則django會從快取中取出資料,影響最後的查詢結果。12如果期間資料庫的內容作了更改,則需要重新查值。否則容易產生髒資料。
可以直接利用第一次的obj物件直接進行update操作,這樣下次for迴圈查詢時又重新執行了資料庫查詢操作,此時快取也作了更改; 也可以重新手動查詢一下結果,但是不推薦這樣,因為我們並不知道資料什麼時候會進行修改,妥善的還是django用資料時自己去查詢資料結果
3456
789# objs=models.book.objects.
all
() # [obj1,obj2,ob3...]
#
for
obj
in
objs: # 每一obj就是乙個行物件,此時會執行sql
# print(
"obj:"
,obj)
models.bool.
update
.get(id=2).
update
(
'title'
=
'yyy'
) # 資料庫內更改,快取未更改
# objs=models.book.objects.
all
() 重新從資料庫內查詢並賦值給objs
# objs.
update
(title=
'yyy'
) 推薦使用,直接資料庫/記憶體都更改了,下面
for
迴圈查詢時重新執行了資料庫
# objs=models.book.objects.
all
() # [obj1,obj2,ob3...]
#
for
obj
in
objs:
# print(
"obj:"
,obj) # 還是objs物件,所以從快取中取值
正確操作:
1. 重新執行查詢 objs=models.book.objects.all() 【不推薦】
2. 利用objs.update(title='yyy'); 此時資料庫已經更改,快取內的值也做了更改
注意2:12
3if objs(): 查詢資料庫,並且將查詢的所有資料結果放入資料庫內
if objs.exist(): 僅僅查詢資料庫,但是不會把所有的資料放入資料庫內,
if obj.iterator():資料放入迭代器內,用一次迭代一次取一次即可
ORM的惰性機制
django惰性機制 所謂惰性機制 publisher.objects.all 或者.filter 等都只是返回了乙個queryset 查詢結果集物件 它並不會馬上執行sql,而是當呼叫queryset的時候才執行。惰性機制之可迭代 objs models.book.objects.all obj1...
diango中orm的惰性機制
那麼首先要知道什麼是orm 那具體orm是什麼呢?在django中,根據 中的類自動生成資料庫的表也叫 code first orm orm在物件導向模型與關係模型之間架起橋梁。通過物件與資料庫之間對映的元資料,自動透明地把編譯語音中的物件持久化到關聯式資料庫裡,對資料庫的操作可以轉換為對物件的操作...
Django 惰性機制
惰性機制 publisher.objects.all 或者.filter 等都只是返回了乙個queryset 查詢結果集物件 它並不會馬上執行sql,而是當呼叫queryset的時候才執行sql,為了測試,我們加上 sql 日誌。在 settings.py 檔案上修改 在最後新增 logging l...