整潔的問題......你知道,這從來沒有發生過我。簡單的答案是,Django本身不需要需要來驗證DATABASE_NAME實際存在,但它確實需要連接到數據庫才能創建測試數據庫。大多數數據庫接受(並且需要)DATABASE_NAME以便形成連接字符串;通常這是因爲您連接的數據庫名稱會影響連接會話的權限。
由於測試數據庫尚不存在,因此django必須首先使用正常settings.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-by-db基礎上做出例外,因爲並不是每個DB都需要連接字符串中的當前數據庫名稱,但這需要一點重構。目前,create_test_db
函數實際上是在backend
基類之一中,並且大多數實際的後端處理程序不會覆蓋它,所以在每個後端都有相當數量的代碼推送下游並複製。
太棒了Jarret!謝謝 – 2009-03-06 06:31:11