django枠組み事務処理小結【ORM事務及びraw sql、customize sql事務処理】


この実例は、djangoフレームワークの処理について述べている。皆さんに参考にしてあげます。具体的には以下の通りです。
djangoで事務処理を要求する場合は2つあります。
1.django orMによるトランスアクション処理
2.カスタムSQL文に基づくトランスアクションの処理で、通常は比較的複雑なSQLで、ORMで不便を処理する時に使う。あるいは大ロットSQL文で実行され、効率が気になる場合に使います。
まず第二の状況を説明します。この状況は比較的簡単ですから、ORMほど多くないです。私が書いた方法で説明します。

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はリストを表しています。中には自分で書いたSQL文がたくさんあります。これらの文は一つの事務で完成することを要求しています。
第一の状況を見てください。ORMを使う時、事務の処理があります。これはdjangoの公式文書に説明されています。以下の簡単な翻訳を紹介します。
1.djangoデフォルトの事務は自動的に処理されています。orMのmodel.save()を呼び出して、model.delete()を呼び出すと、すべての変更はすぐに提出されます。データベースにaut comitが設置されています。隠していないrollbackです。
2.httpに要求された事務ブロックに対して、これは推奨の方式で、transpationの中間部品を使って完成します。これは比較的に良い方法ですが、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',
)

ただし、このように配置すると、中間部品の配置順序が大きく関係します。Transaction Middleware以降のすべてのミドルウェアは、事務によってコントロールされます。だからあなたがsessionのミドルウェアをTransationに置いた後も影響を受けます。しかし  Cachemiddleware,UpdateCachemiddleware,and FetFrom Cachemiddleware  影響を受けません。cacheの仕組みは自分の処理方法があります。内部のconnectionで処理します。
またTransaction Middlewareはdefaultのデータベース配置にのみ有効であり、別のデータ接続に対してこのような方式を使うなら、自分で中間部品を実現しなければなりません。
3.自分で事務をコントロールしている場合、あなた自身は仕事を柔軟にコントロールしています。Settings.pyにTransation Middlewareのミドルウェアを配置しなくてもいいです。基本的に装飾モードを採用して実現します。
a)@transaction.autocommit、djangoのデフォルトの事務処理は、この装飾パターンを採用すると、全体のtranspaction設定を無視します。

from django.db import transaction
@transaction.autocommit
def viewfunc(request):
  ....
@transaction.autocommit(using="my_other_database")
def viewfunc2(request):
  ....

b)@transaction.commit_on_successは、一つの方法では、すべての作業が完了したら、事務を提出する。

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()を呼び出していなかったら、Transation Management Errrorを投げます。

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プログラムの設計に役立ちます。