一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - django框架事務處理小結【ORM 事務及raw sql,customize sql 事務處理】

django框架事務處理小結【ORM 事務及raw sql,customize sql 事務處理】

2021-07-25 00:05輕舞肥羊 Python

這篇文章主要介紹了django框架事務處理,結合實例形式總結分析了使用ORM 事務及raw sql,customize sql 事務處理相關實現技巧與操作注意事項,需要的朋友可以參考下

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

django 中要求事務處理的情況有兩種:

1.基于django orM 的 transaction 處理

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

首先說一下第二種情況,因為這種情況相對簡單一點,沒ORM 那么多東西,用我寫的一個方法來解釋

?
1
2
3
4
5
6
7
8
9
10
11
12
13
from django.db import connection, transaction
.....
def batch_execsql(sqlarray):
  cursor = connection.cursor() # 得到處理的游標對象
  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 語句情況下處理事務的方法. 上面的例子中的 sqlarray 表示一個list,里面有很多自己寫的SQL 語句,而這些語句要求在一個事務中完成。

再來看看第一種情況,用ORM 的時候,事務的處理. 這在django 的官方文檔中有說明,下面簡單翻譯介紹下

1. django 默認的事務, 是自動處理的,當你在調用 orM 的model.save(),model.delete()的時候,所有改動會被立即提交的,相當于數據庫設置了auto commit,沒有隱藏的rollback.

2.對http請求的事務攔截,這是推薦的方式,使用了transaction中間件來完成,這是比較好的方法,但必須在settings.py中配置.

?
1
2
3
4
5
6
7
MIDDLEWARE_CLASSES = (
  'django.middleware.cache.UpdateCacheMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  'django.middleware.common.CommonMiddleware',
  'django.middleware.transaction.TransactionMiddleware',
  'django.middleware.cache.FetchFromCacheMiddleware',
)

但需要注意的是,這樣配置之后,與你中間件的配置順序是有很大關系的。在 TransactionMiddleware 之后的所有中間件都會受到事務的控制。所以當你把session 中間件放到 Transaction之后,同樣會受到影響。但  CacheMiddleware, UpdateCacheMiddleware, and FetchFromCacheMiddleware  不會受到影響,cache機制有自己的處理方式,用了內部的connection來處理

另外 TransactionMiddleware 只對 default 的數據庫配置有效,如果要對另外的數據連接用這種方式,必須自己實現中間件。

3.自己來控制事務,這種情況下,你自己靈活控制事務.在settings.py 中不用配置 TransactionMiddleware 中間件了, 基本采用裝飾模式來實現。

a) @transaction.autocommit ,django默認的事務處理, 采用此裝飾模式會忽略掉全局的transaction 設置

?
1
2
3
4
5
6
7
from django.db import transaction
@transaction.autocommit
def viewfunc(request):
  ....
@transaction.autocommit(using="my_other_database")
def viewfunc2(request):
  ....

b) @transaction.commit_on_success 在一個方法中,所有工作完成后,提交事務。

?
1
2
3
4
5
6
7
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() ,完全自己處理,但如果你沒有調用commit()或者rollback(),將會拋出TransactionManagementError 異常.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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程序設計有所幫助。

原文鏈接:http://www.yihaomen.com/article/python/267.htm

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 半挠脚心半黄的网站 | 性xxxx中国 | 欧美香蕉 | 色亚洲视频 | 亚洲大片免费观看 | 婷婷综合七月激情啪啪 | 四虎永久网址影院 | 午夜影院网站 | 精品四虎国产在免费观看 | 王淑兰与铁柱全文免费阅读 | 成人小视频在线免费观看 | 国产精品66福利在线观看 | 日本三级大学生17 | 亚洲欧美自偷自拍另类小说 | 国产精品吹潮香蕉在线观看 | 动漫美女被褥吸奶漫画漫画 | 91久操| 亚洲一区二区福利视频 | 青草午夜精品视频在线观看 | 精品亚洲视频在线观看 | 爱欲荡漾在线观看 | 亚洲无限观看 | 黄绝一级 | 精品久久免费视频 | 青草草在线观看 | 紧身裙女教师波多野结衣 | 男女发生性关系视频 | www.四色| 欧美一级乱妇老太婆特黄 | 被老外玩爽的中国美女视频 | 成人影院vs一区二区 | 四虎影视紧急入口地址大全 | 国产精品一区二区国产 | 情趣内衣情趣玩具play | 日本人黄色 | 日本三级在线观看免费 | 97精品国产自在现线免费 | 国产精品视频色拍拍 | 99re8在这里只有精品23 | 日本老妇和子乱视频 | 热久久免费 |