2013-11-22 70 views
2

我們是使用PostgreSQL數據庫後端的應用程序的開發人員的小團隊。我們每個人都有一個單獨的工作目錄和virtualenv,但我們共享相同的PostgreSQL數據庫服務器,即使Jenkins在同一臺機器上。在Django中使用動態數據庫TEST_NAME會危險嗎?

所以我試圖找出辦法,讓我們沒有運行到一個數據庫名稱衝突運行並聯同一項目的測試。此外,有時一個Jenkins構建會在中途失敗,並且測試數據庫最終不會被丟棄,這樣後續的Jenkins構建可能會被現有數據庫弄糊塗並自動失敗。

我已經決定嘗試是這樣的:

import os 
from datetime import datetime 

DATABASES = { 
    'default': { 
     # the usual lines ... 
     TEST_NAME: '{user}_{epoch_ts}_awesome_app'.format(
      user=os.environ.get('USER', os.environ['LOGNAME']), 
      # This gives the number of seconds since the UNIX epoch 
      epoch_ts=int((datetime.utcnow() - datetime.utcfromtimestamp(0)).total_seconds()) 
     ), 
     # etc 
    } 
} 

因此,在每個測試運行最有可能測試數據庫名稱將是獨一無二的,使用用戶名和時間戳。詹金斯甚至可以並行運行構建,我認爲。

它似乎工作至今。但是它會危險嗎?我猜我們是安全的,只要我們不要試圖直接導入項目設置模塊,並且只使用django.conf.settings因爲應該是單身樣和只計算一次,對嗎?

回答

1

我在做類似的東西,並沒有遇到任何問題。應遵循通常的預防措施:

  1. 請勿直接訪問settings

  2. settings不會引起值模塊的頂層進行評估。有關詳細信息,請參閱doc。舉例來說,不這樣做:

    from django.conf import settings 
    
    # This is bad because settings might still be in the process of being 
    # configured at this stage. 
    blah = settings.BLAH 
    
    def some_view(): 
        # This is okay because by the time views are called by Django, 
        # the settings are supposed to be all configured. 
        blah = settings.BLAH 
    
  3. 不要做任何一個訪問模塊的頂級數據庫。 doc警告:

    如果您的代碼在編譯模塊時嘗試訪問數據庫,則會在測試數據庫設置之前發生,並且可能會有意外的結果。例如,如果您在模塊級代碼中存在數據庫查詢並且存在真實數據庫,則生產數據可能會污染您的測試。無論如何,在你的代碼中有這樣的導入時間數據庫查詢是一個糟糕的主意 - 重寫你的代碼,以便它不這樣做。

0

,而不是時間,你可以使用詹金斯執行數(可在環境中);這將是獨一無二的,你不必擔心它的變化。

作爲獎勵,您可以使用--keepdb避免每次重新從頭開始重建數據庫......缺點是,失敗和損壞的數據庫將不得不單獨丟棄(也許settings.py可以打印出來它使用的數據庫名稱,以方便手動刪除)。

相關問題