私はDjango ORMを使用するPythonの長いプロセスを持っています。時にはdo_stuff
は、データベース・サーバがアイドルとして接続を殺したので、わたしのMySQL接続がタイムアウトエラーにその時点で私が実行していた、本当に長い時間がかかるデータベース接続を閉じるDjangoのメソッドをテストするにはどうすればよいですか?
import django
from django.db import connection
from my_app import models
def my_process():
django.setup()
while (True):
do_stuff()
connection.close()
models.MyDjangoModel().save()
:それは次のようになります。 connection.close()
行を追加すると、djangoは毎回新しい接続を取得し、その問題を修正します。 (https://code.djangoproject.com/ticket/21597参照)。
しかし、私はdjango.test.TestCase
を使用してこのプロセスをテストしていて、DjangoのTestCase
クラスは、トランザクション内でテストを包むようconnection.close
を呼び出すと、これらのテストが失敗し、そのトランザクション内の接続を閉じると、トランザクションが破損する原因となり、A提起django.db.transaction.TransactionManagementError
。
私はCONN_MAX_AGE
データベースパラメータを設定し、代わりにconnection.close_if_unusable_or_obsolete
を呼び出しますが、トランザクションはまた今度にしようとするclose_if_unusable_or_obsolete
を引き起こしFalse
からTrue
の設定のデフォルト値からの接続のautocommit
設定を変更されて試してみました。この問題を解決する一つの試みととにかく接続を閉じてください(https://github.com/django/django/blob/master/django/db/backends/base/base.py#L497)。
私もconnection.close
を試してみることができますので、何もしませんが、それはハッキーのようです。
データベース接続を閉じる必要があるdjangoメソッドをテストする最良の方法は何ですか?