こんにちは、habralyudi。 昨日、人気のあるPythonのWebフレームワークであるDjangoのブログで、1.6という新しいバージョンのリリースに関するニュースがありました。
すべての革新の完全なリスト、および変更に関する情報(後方互換性のないものも含む)は、リリースノートに伝統的に記載されています 。 私の考えでは、今回は開発者がデータベースの操作に重点を置いていました。
このニュース記事では、私の意見では、主な変更点に注目したいと思います。
トランザクションを操作する
1.6では、トランザクションを操作するための新しいAPIが登場しました。 このバージョンから、
django.db.transaction
      
      ある
django.db.transaction
      
      モジュールの
autocommit()
      
      、
commit_on_success()
      
      および
commit_manually()
      
      関数
django.db.transaction
      
      廃止されたと見なされ、1.8まで互換性を維持します。 それらは
atomic()
      
      置き換えられます。
ここでの主なロジックは次のとおりです:以前、キーポイントはトランザクションコミットを操作するときの動作制御メカニズムでした-自動コミット(つまり、各SQLクエリはトランザクションを開始して自動的にコミットします)または手動コミット(
COMMIT;
      
      SQLクエリは独立して送信されます) このメカニズムは、独立したトランザクションの場合は非常にうまく機能しましたが、廃止された関数をネストして使用する場合、結果は不正確になる可能性があります。 たとえば、2つの
commit_on_success()
      
      ブロックが相互にネストされている場合、内部ブロックの実行結果がトランザクションの観点から外部ブロックのアトミック性を壊してしまいます。
これから何が起こるか:最初に、jungaはデフォルトで自動コミットモードをオンにします。これはPEP 249に違反して、注目に値します。 次に、トランザクションを操作するための唯一のメカニズムは
atomic()
      
      。これはネストを恐れません。 外部ブロックの場合はトランザクションで動作し、ネストされたブロックの場合はSQLストレージポイントで動作します。 また、
TransactionMiddleware
      
      代わりに、構成定数
ATOMIC_REQUESTS
      
      。その値を
True
      
      (デフォルト値は
False
      
      )に設定すると、djangoは1つのトランザクションで1つのHTTP要求を処理しようとします。 つまり 要求は問題なく実行されました-コミット済み、いいえ-ロールバックされました。
atomic()
      
      は、デコレータまたはコンテキストマネージャとして使用できることに注意してください。
 from django.db import transaction #  @transaction.atomic def viewfunc1(request): #       do_stuff() and as a context manager: #   def viewfunc2(request): #       do_stuff() with transaction.atomic(): #       do_more_stuff()
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      より詳細な説明は、いつものように、ドキュメントで利用可能です。
永続的なデータベース接続
もちろん、これはプル接続ではありません。 これらは、アプリケーションが実行されているスレッドによって分離されます。 ただし、これは、パフォーマンスの点で、すべてのHTTP要求でデータベースに常時接続するよりもはるかに優れています。 接続の存続期間は、構成定数
CONN_MAX_AGE
      
      によって制御されます。
テスト
1.6では、新しい
django.test.runner.DiscoverRunner
      
      テスト
django.test.runner.DiscoverRunner
      
      。これは、
unittest2
      
      からのテストでモジュール検索ロジックを使用し
unittest2
      
      。 これで、テストを含むファイルの名前が
test*.py
      
      マスクと一致する場合、テストを任意のモジュールに配置できます。
ただし、同時に、
models.py
      
      および
tests/__init__.py
      
      からの
tests/__init__.py
      
      が見つかったため、それらは起動されません(以前のバージョンの動作とは異なります)。 最も簡単な解決策は、それらの名前を
test_models.py
      
      や
tests/test.py
      
      などに変更することです。 また、ドキュメントは自動的にロードされなくなります。 しかし、
unittest
      
      ドキュメントの指示に従ってそれらを元に戻すことは難しくありません。
ところで、管理チームの
./manage.py test
      
      には
--pattern
      
      オプションがあり、テストでファイルを検索するためにマスクを変更できることを指定します。
経営陣チェック
django-admin.py check
      
      コマンドを使用すると、プロジェクトまたはアプリケーションと現在のバージョンのジャングルとの互換性を確認できるようになり、互換性のない場所が見つかった場合にアラートが表示されます。 このコマンドは、フレームワークの新しいバージョンへの移行に役立つと想定されています。
ちなみに、1.6はジャングルの最新リリースであり、Pythonバージョン2.6を引き続きサポートしています。 次のリリースから、少なくとも2.7のPythonが必要になります。
ORMの改善
QuerySet
      
      は、
first()
      
      および
last()
      
      メソッドの形式の構文シュガー、および
latest()
      
      に加えて
earliest()
      
      メソッドをサポートするようになりました。
ORMは、日付や時刻を持つフィールドを検索するときに、以前に追加された
year
      
      、
month
      
      day
      
      に加えて、
hour
      
      、
minute
      
      second
      
      をサポートするようになりました。
まあ、伝統的な調査。 割合に関心があるため、複数のバージョンを使用する場合は、メインの開発が行われているバージョンを示すのが理にかなっています。