2009-01-30 50 views
25

因爲我通常不會在Django項目中對我的模型進行前期設計,所以我最終修改了很多模型,因此每次都刪除我的測試數據庫(因爲「syncdb」不會爲您自動更改表格)。下面是我的工作流程,我想聽聽你的消息。任何想法歡迎..Django頻繁修改模型時的工作流程?

  1. 修改模型。
  2. 刪除測試數據庫。 (對我來說總是一個簡單的sqlite數據庫。)
  3. 運行「syncdb」。
  4. 通過代碼生成一些測試數據。
  5. 轉到1.

關於此的..如果您的工作流程是像上面,你如何執行4步次要的問題?您是手動生成測試數據還是在Django應用程序中有適當的掛鉤點,您可以在服務器啓動時注入測試數據生成代碼?\

TIA。

回答

22

步驟2 & 3可以在一個步驟中完成:

manage.py reset appname 

第4步是最容易管理,從我的理解,通過使用fixtures

+0

如果您已經對model.py代碼進行了一些更改,則這不起作用。要求它們與數據庫同步。 – 2011-10-31 04:03:18

15

這是Django的燈具工作。它們很方便,因爲它們獨立於數據庫,並且測試工具(和manage.py)內置了對它們的支持。

使用它們:

  1. 在您的應用程序設置您的數據(稱之爲 其「富」)使用管理工具
  2. 在 「foo」的應用程序目錄下創建一個fixtures目錄
  3. 類型:現在python manage.py dumpdata --indent=4 foo > foo/fixtures/foo.json

,你執行syncdb階段之後,你只需要輸入:

python manage.py loaddata foo.json 

並且您的數據將被重新創建。

如果你想他們在一個測試用例:

class FooTests(TestCase): 
    fixtures = ['foo.json'] 

注意,您將不得不重新創建或手動更新您的燈具,如果你的模式急劇變化。

你可以閱讀更多關於Django文檔固定裝置Fixture Loading

+2

不要忘記`manage.py dumpdata app> app.json`來備份你所擁有的東西 – 2009-01-31 02:35:01

+1

S.洛特 - 除非我誤解你,這不是我的第3步所涵蓋的嗎? – 2009-01-31 02:46:23

12

下面是我們做什麼。

  1. 應用程序以Schema版本號命名。 appa_2,appb_1

  2. 微小的變化不會改變數量。

  3. 重大更改會增加數量。 Syncdb工作。並且可以編寫「數據遷移」腳本。

    def migrate_appa_2_to_3(): 
        for a in appa_2.SomeThing.objects.all(): 
         appa_3.AnotherThing.create(a.this, a.that) 
         appa_3.NewThing.create(a.another, a.yetAnother) 
        for b in ... 
    

的一點是,刪除並重建並不總是合適的。將數據從舊模型移動到新模型而不從頭開始重建是有幫助的。

4

爲了增加Matthew的迴應,我還經常使用自定義SQL來提供初始數據,記錄爲here

Django只查找<app>/sql/<modelname>.sql中的文件,並在syncdbsqlreset期間創建表格後運行它們。當我需要做一些類似於從其他非Django數據庫表填充我的Django表時,我使用自定義SQL。

1

我個人的開發數據庫對於我現在正在使用的項目來說是相當大的,所以我使用dmigrations來創建數據庫遷移腳本來修改數據庫(而不是每次像我在開始時那樣擦掉數據庫)。

編輯:其實,我使用的是南方現:-)