すてきな質問...あなたが知っている、これは私には決してなかった。 DATABASE_NAMEが実際に存在することを確認するには、にが必要ですが、テストデータベースを作成するにはデータベースに接続する必要があります。ほとんどのデータベースは、接続文字列を作成するためにDATABASE_NAMEを受け入れます(そして必要とするものもあります)。これは、接続先のデータベース名が接続セッションのアクセス許可に寄与しているためです。
テストデータベースがまだ存在しないため、djangoはまず、テストデータベースを作成するために、通常の設定である.DATABASE_NAMEを使用して接続する必要があります。
だから、それは次のように動作します。
- Djangoのテストランナは、バックエンド固有のデータベースハンドラ
- にオフ渡すバックエンド固有のデータベースハンドラがに、通常の設定を使用します
create_test_db
と呼ばれる機能を持っていますデータベースに接続します。通常の設定値を使用する明白なcursor = self.connection.cursor()
コマンドを使用してこれを行います。これは、この時点ですべてが存在することが分かっているためです。
- データベースに接続すると、バックエンド固有のハンドラは、新しいテストデータベースの名前を持つ
CREATE DATABASE
コマンドを発行します。
- バックエンド固有のハンドラが接続を終了し、テストランナーに戻り、test_database_nameの通常の
settings.DATABASE_NAME
をスワップします
- テストは正常に実行されます。その後のすべての
connection.cursor()
の呼び出しは通常の設定モジュールを使用しますが、そのモジュールはスワップアウトされたデータベース名を持ちます
- 最後に、テストランナーは、バックエンド固有のハンドラーの
destroy_test_db
関数を呼び出した後に古いデータベース名を復元します。
興味がある場合は、主要な部分の関連コードはdjango.db.backends.creationにあります。 _create_test_db
関数を見てください。
Djangoデザイナーは、すべてのDBが接続文字列に現在のデータベース名を必要としているわけではないので、DBベースで例外を作成することは可能ですが、リファクタリングが少し必要です。現時点では、create_test_db
関数は実際にはbackend
の基本クラスの1つに含まれており、実際のバックエンドハンドラのほとんどはそれをオーバーライドしないため、下流にプッシュして各バックエンドに複製するかなりの量のコードがあります。
恐ろしいジャレット!ありがとう –
+1ソースを掘り出してください。 –