最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

django框架事務(wù)處理小結(jié)【ORM 事務(wù)及raw sql,customize sql 事務(wù)處理】

 更新時(shí)間:2019年06月27日 10:56:40   作者:輕舞肥羊  
這篇文章主要介紹了django框架事務(wù)處理,結(jié)合實(shí)例形式總結(jié)分析了使用ORM 事務(wù)及raw sql,customize sql 事務(wù)處理相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了django框架事務(wù)處理。分享給大家供大家參考,具體如下:

django 中要求事務(wù)處理的情況有兩種:

1.基于django orM 的 transaction 處理

2.是基于自定義SQL 語(yǔ)句的transaction的處理,通常是比較復(fù)雜的SQL ,用ORM 處理不方便的時(shí)候用的。或者是大批量SQL語(yǔ)句執(zhí)行,比較在意效率的情況下用。

首先說(shuō)一下第二種情況,因?yàn)檫@種情況相對(duì)簡(jiǎn)單一點(diǎn),沒(méi)ORM 那么多東西,用我寫的一個(gè)方法來(lái)解釋

from django.db import connection, transaction
.....
def batch_execsql(sqlarray):
  cursor = connection.cursor() # 得到處理的游標(biāo)對(duì)象
  ret=""
  try:
    for sql in sqlarray:
      cursor.execute(sql)
    transaction.commit_unless_managed() # 這是重點(diǎn),沒(méi)有這條語(yǔ)句,就不會(huì)commit 。
  except Exception,e: #簡(jiǎn)單的異常處理,可以忽略
    ret=str(e)
  cursor.close()
  return ret #有異常則返回異常,否則返回為空字符串

由上面可以看出 transaction.commit_unless_managed()的重要性,這是自定義SQL 語(yǔ)句情況下處理事務(wù)的方法. 上面的例子中的 sqlarray 表示一個(gè)list,里面有很多自己寫的SQL 語(yǔ)句,而這些語(yǔ)句要求在一個(gè)事務(wù)中完成。

再來(lái)看看第一種情況,用ORM 的時(shí)候,事務(wù)的處理. 這在django 的官方文檔中有說(shuō)明,下面簡(jiǎn)單翻譯介紹下

1. django 默認(rèn)的事務(wù), 是自動(dòng)處理的,當(dāng)你在調(diào)用 orM 的model.save(),model.delete()的時(shí)候,所有改動(dòng)會(huì)被立即提交的,相當(dāng)于數(shù)據(jù)庫(kù)設(shè)置了auto commit,沒(méi)有隱藏的rollback.

2.對(duì)http請(qǐng)求的事務(wù)攔截,這是推薦的方式,使用了transaction中間件來(lái)完成,這是比較好的方法,但必須在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 之后的所有中間件都會(huì)受到事務(wù)的控制。所以當(dāng)你把session 中間件放到 Transaction之后,同樣會(huì)受到影響。但  CacheMiddleware, UpdateCacheMiddleware, and FetchFromCacheMiddleware  不會(huì)受到影響,cache機(jī)制有自己的處理方式,用了內(nèi)部的connection來(lái)處理

另外 TransactionMiddleware 只對(duì) default 的數(shù)據(jù)庫(kù)配置有效,如果要對(duì)另外的數(shù)據(jù)連接用這種方式,必須自己實(shí)現(xiàn)中間件。

3.自己來(lái)控制事務(wù),這種情況下,你自己靈活控制事務(wù).在settings.py 中不用配置 TransactionMiddleware 中間件了, 基本采用裝飾模式來(lái)實(shí)現(xiàn)。

a) @transaction.autocommit ,django默認(rèn)的事務(wù)處理, 采用此裝飾模式會(huì)忽略掉全局的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 在一個(gè)方法中,所有工作完成后,提交事務(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() ,完全自己處理,但如果你沒(méi)有調(diào)用commit()或者rollback(),將會(huì)拋出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):
  ....

希望本文所述對(duì)大家基于Django框架的Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • python查找特定名稱文件并按序號(hào)、文件名分行打印輸出的方法

    python查找特定名稱文件并按序號(hào)、文件名分行打印輸出的方法

    這篇文章主要介紹了python查找特定名稱文件并按序號(hào)、文件名分行打印輸出的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Tensorflow自定義模型與訓(xùn)練超詳細(xì)講解

    Tensorflow自定義模型與訓(xùn)練超詳細(xì)講解

    TensorFlow是基于數(shù)據(jù)流編程的符號(hào)數(shù)學(xué)系統(tǒng),廣泛用于機(jī)器學(xué)習(xí)算法的編程實(shí)現(xiàn),前身是谷歌的神經(jīng)網(wǎng)絡(luò)算法庫(kù)DistBelief,Tensorflow擁有多層級(jí)結(jié)構(gòu),可部署于各類服務(wù)器、PC終端和網(wǎng)頁(yè)并支持GPU和TPU高性能數(shù)值計(jì)算,被廣泛應(yīng)用于谷歌內(nèi)部的產(chǎn)品開發(fā)和各領(lǐng)域的科學(xué)研究
    2022-11-11
  • python實(shí)現(xiàn)RabbitMQ的消息隊(duì)列的示例代碼

    python實(shí)現(xiàn)RabbitMQ的消息隊(duì)列的示例代碼

    這篇文章主要介紹了python實(shí)現(xiàn)RabbitMQ的消息隊(duì)列的示例代碼,總結(jié)了RabbitMQ中三種exchange模式的實(shí)現(xiàn),分別是fanout, direct和topic。感興趣的小伙伴們可以參考一下
    2018-11-11
  • django虛擬環(huán)境(virtualenv)的創(chuàng)建

    django虛擬環(huán)境(virtualenv)的創(chuàng)建

    在使用django開發(fā)項(xiàng)目的時(shí)候,一個(gè)環(huán)境只能對(duì)應(yīng)一個(gè)項(xiàng)目,若不安裝虛擬環(huán)境、都裝在系統(tǒng)里面,每次項(xiàng)目加載都需要加載所有的安裝包,本文就介紹django虛擬環(huán)境的安裝,感興趣的可以了解一下
    2021-08-08
  • Python利用AutoGrad實(shí)現(xiàn)自動(dòng)計(jì)算函數(shù)斜率和梯度

    Python利用AutoGrad實(shí)現(xiàn)自動(dòng)計(jì)算函數(shù)斜率和梯度

    AutoGrad 是一個(gè)老少皆宜的 Python 梯度計(jì)算模塊。對(duì)于大學(xué)生、機(jī)器學(xué)習(xí)愛好者而言,你只需要傳遞給它Numpy這樣的標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)下編寫的損失函數(shù),它就可以自動(dòng)計(jì)算損失函數(shù)的導(dǎo)數(shù)(梯度)。本文將從普通斜率計(jì)算開始,介紹到如何只使用它來(lái)實(shí)現(xiàn)一個(gè)邏輯回歸模型
    2022-07-07
  • 使用Python+Flask開發(fā)博客項(xiàng)目并實(shí)現(xiàn)內(nèi)網(wǎng)穿透

    使用Python+Flask開發(fā)博客項(xiàng)目并實(shí)現(xiàn)內(nèi)網(wǎng)穿透

    Flask是一個(gè)使用python編寫的輕量級(jí)Web框架,這篇文章我們將使用這個(gè)框架編寫一個(gè)屬于自己的博客網(wǎng)站!并教你如何通過(guò)使用內(nèi)網(wǎng)穿透工具處理項(xiàng)目,讓本地的項(xiàng)目可以在公網(wǎng)訪問(wèn),感興趣的可以了解一下
    2021-11-11
  • 正則給header的冒號(hào)兩邊參數(shù)添加單引號(hào)(Python請(qǐng)求用)

    正則給header的冒號(hào)兩邊參數(shù)添加單引號(hào)(Python請(qǐng)求用)

    這篇文章主要介紹了正則給header的冒號(hào)兩邊參數(shù)添加單引號(hào)(Python請(qǐng)求用)的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 詳解Python中的Dict

    詳解Python中的Dict

    這篇文章主要為大家介紹了Python中的Dict,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • 利用Python中xlwt模塊操作excel的示例詳解

    利用Python中xlwt模塊操作excel的示例詳解

    在開發(fā)中,我們最常見的數(shù)據(jù)問(wèn)題之一,就是對(duì)數(shù)據(jù)進(jìn)行導(dǎo)出整理給運(yùn)營(yíng)人員,所以操作excel就顯得重中之重,在python中操作excel可以借助xlwt模塊。感興趣的可以跟隨小編一起學(xué)習(xí)一下這篇文章
    2022-01-01
  • Python如何有效地使用迭代

    Python如何有效地使用迭代

    這篇文章主要為大家詳細(xì)介紹了Python如何有效地使用迭代,文中的示例代碼講解詳細(xì),對(duì)我們深入了解Python有一定的幫助,需要的小伙伴可以學(xué)習(xí)一下
    2023-09-09

最新評(píng)論

凤庆县| 同仁县| 嘉祥县| 平顺县| 岳池县| 保德县| 肥东县| 华宁县| 兴城市| 宜都市| 蒲江县| 陆良县| 昌黎县| 历史| 庆安县| 利川市| 佛冈县| 萨嘎县| 台安县| 宁晋县| 东城区| 清原| 密云县| 秦皇岛市| 克山县| 潍坊市| 临颍县| 平原县| 汤原县| 惠安县| 临海市| 突泉县| 陇南市| 屏山县| 东宁县| 东光县| 井研县| 凤台县| 湟源县| 金门县| 大姚县|