django框架事務(wù)處理小結(jié)【ORM 事務(wù)及raw sql,customize sql 事務(wù)處理】
本文實例講述了django框架事務(wù)處理。分享給大家供大家參考,具體如下:
django 中要求事務(wù)處理的情況有兩種:
1.基于django orM 的 transaction 處理
2.是基于自定義SQL 語句的transaction的處理,通常是比較復(fù)雜的SQL ,用ORM 處理不方便的時候用的?;蛘呤谴笈縎QL語句執(zhí)行,比較在意效率的情況下用。
首先說一下第二種情況,因為這種情況相對簡單一點,沒ORM 那么多東西,用我寫的一個方法來解釋
from django.db import connection, transaction
.....
def batch_execsql(sqlarray):
cursor = connection.cursor() # 得到處理的游標(biāo)對象
ret=""
try:
for sql in sqlarray:
cursor.execute(sql)
transaction.commit_unless_managed() # 這是重點,沒有這條語句,就不會commit 。
except Exception,e: #簡單的異常處理,可以忽略
ret=str(e)
cursor.close()
return ret #有異常則返回異常,否則返回為空字符串
由上面可以看出 transaction.commit_unless_managed()的重要性,這是自定義SQL 語句情況下處理事務(wù)的方法. 上面的例子中的 sqlarray 表示一個list,里面有很多自己寫的SQL 語句,而這些語句要求在一個事務(wù)中完成。
再來看看第一種情況,用ORM 的時候,事務(wù)的處理. 這在django 的官方文檔中有說明,下面簡單翻譯介紹下
1. django 默認(rèn)的事務(wù), 是自動處理的,當(dāng)你在調(diào)用 orM 的model.save(),model.delete()的時候,所有改動會被立即提交的,相當(dāng)于數(shù)據(jù)庫設(shè)置了auto commit,沒有隱藏的rollback.
2.對http請求的事務(wù)攔截,這是推薦的方式,使用了transaction中間件來完成,這是比較好的方法,但必須在settings.py中配置.
MIDDLEWARE_CLASSES = ( 'django.middleware.cache.UpdateCacheMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.transaction.TransactionMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware', )
但需要注意的是,這樣配置之后,與你中間件的配置順序是有很大關(guān)系的。在 TransactionMiddleware 之后的所有中間件都會受到事務(wù)的控制。所以當(dāng)你把session 中間件放到 Transaction之后,同樣會受到影響。但 CacheMiddleware, UpdateCacheMiddleware, and FetchFromCacheMiddleware 不會受到影響,cache機(jī)制有自己的處理方式,用了內(nèi)部的connection來處理
另外 TransactionMiddleware 只對 default 的數(shù)據(jù)庫配置有效,如果要對另外的數(shù)據(jù)連接用這種方式,必須自己實現(xiàn)中間件。
3.自己來控制事務(wù),這種情況下,你自己靈活控制事務(wù).在settings.py 中不用配置 TransactionMiddleware 中間件了, 基本采用裝飾模式來實現(xiàn)。
a) @transaction.autocommit ,django默認(rèn)的事務(wù)處理, 采用此裝飾模式會忽略掉全局的transaction 設(shè)置
from django.db import transaction @transaction.autocommit def viewfunc(request): .... @transaction.autocommit(using="my_other_database") def viewfunc2(request): ....
b) @transaction.commit_on_success 在一個方法中,所有工作完成后,提交事務(wù)。
from django.db import transaction @transaction.commit_on_success def viewfunc(request): .... @transaction.commit_on_success(using="my_other_database") def viewfunc2(request): ....
c) commit_manually() ,完全自己處理,但如果你沒有調(diào)用commit()或者rollback(),將會拋出TransactionManagementError 異常.
from django.db import transaction
@transaction.commit_manually
def viewfunc(request):
...
# You can commit/rollback however and whenever you want
transaction.commit()
...
# But you've got to remember to do it yourself!
try:
...
except:
transaction.rollback()
else:
transaction.commit()
@transaction.commit_manually(using="my_other_database")
def viewfunc2(request):
....
希望本文所述對大家基于Django框架的Python程序設(shè)計有所幫助。
相關(guān)文章
python查找特定名稱文件并按序號、文件名分行打印輸出的方法
這篇文章主要介紹了python查找特定名稱文件并按序號、文件名分行打印輸出的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
Tensorflow自定義模型與訓(xùn)練超詳細(xì)講解
TensorFlow是基于數(shù)據(jù)流編程的符號數(shù)學(xué)系統(tǒng),廣泛用于機(jī)器學(xué)習(xí)算法的編程實現(xiàn),前身是谷歌的神經(jīng)網(wǎng)絡(luò)算法庫DistBelief,Tensorflow擁有多層級結(jié)構(gòu),可部署于各類服務(wù)器、PC終端和網(wǎng)頁并支持GPU和TPU高性能數(shù)值計算,被廣泛應(yīng)用于谷歌內(nèi)部的產(chǎn)品開發(fā)和各領(lǐng)域的科學(xué)研究2022-11-11
python實現(xiàn)RabbitMQ的消息隊列的示例代碼
這篇文章主要介紹了python實現(xiàn)RabbitMQ的消息隊列的示例代碼,總結(jié)了RabbitMQ中三種exchange模式的實現(xiàn),分別是fanout, direct和topic。感興趣的小伙伴們可以參考一下2018-11-11
django虛擬環(huán)境(virtualenv)的創(chuàng)建
在使用django開發(fā)項目的時候,一個環(huán)境只能對應(yīng)一個項目,若不安裝虛擬環(huán)境、都裝在系統(tǒng)里面,每次項目加載都需要加載所有的安裝包,本文就介紹django虛擬環(huán)境的安裝,感興趣的可以了解一下2021-08-08
Python利用AutoGrad實現(xiàn)自動計算函數(shù)斜率和梯度
AutoGrad 是一個老少皆宜的 Python 梯度計算模塊。對于大學(xué)生、機(jī)器學(xué)習(xí)愛好者而言,你只需要傳遞給它Numpy這樣的標(biāo)準(zhǔn)數(shù)據(jù)庫下編寫的損失函數(shù),它就可以自動計算損失函數(shù)的導(dǎo)數(shù)(梯度)。本文將從普通斜率計算開始,介紹到如何只使用它來實現(xiàn)一個邏輯回歸模型2022-07-07
使用Python+Flask開發(fā)博客項目并實現(xiàn)內(nèi)網(wǎng)穿透
Flask是一個使用python編寫的輕量級Web框架,這篇文章我們將使用這個框架編寫一個屬于自己的博客網(wǎng)站!并教你如何通過使用內(nèi)網(wǎng)穿透工具處理項目,讓本地的項目可以在公網(wǎng)訪問,感興趣的可以了解一下2021-11-11
正則給header的冒號兩邊參數(shù)添加單引號(Python請求用)
這篇文章主要介紹了正則給header的冒號兩邊參數(shù)添加單引號(Python請求用)的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08

