2013-08-07 38 views
1

我創建了一個示例Django應用程序,其中包含多個模型和填充數據。在Django模型中添加新列

現在,我需要添加一個新的列到其中一個模型?

這是我的顧慮嗎?

  1. 如果在向模型添加一列後執行syncdb會發生什麼情況,它會改變表格並添加新列?
  2. 或者它會刪除所有的列後創建一個新的表?

有沒有更好的方法來解決這個問題?

回答

3

syncdb不適用於更改數據庫表。 這裏是the documentation(電文讀出上:執行syncdb不會改變現有的表)

一個乾淨的方式來實現,這將是你的情況下,使用第三方工具,如django south這將處理遷移(小心使用ALTER TABLE腳本) 爲你。

這裏是南方step by step tutorial,這裏是official documentation on south

+1

South已經成爲管理這個工具的主要工具,但您也可以修改您的模式以直接添加列。就像'alter table myapp_mymodel add column mycolumn integer;' - 或者什麼取決於你的數據類型和數據庫後端。這是不太可維護的,所以它不是首選的方法,但如果你只需要一個小的修改它是一個選項。 –

+0

同意。尤其是當項目處於開發的早期階段,並且您仍在本地開發時,它是一個不錯的選擇 – karthikr

+0

如果您最終確實手工完成更改,'python manage.py sql '會輸出sql Django會如果它正在爲應用程序創建表,請使用它。這對於保持列類型的一致性更重要,對於獲取外鍵約束和索引等更重要。 –

0

在發展中,我使用了復位功能很多。這對我很有用,因爲我不介意吹走開發數據。它基本上只爲該應用程序創建新的數據庫表 - 因此它將刪除您的數據。如果您希望保持數據填充,則無用,如上所述,南方更好。

python manage.py reset <app-name> 
+1

'reset'自1.5起棄用。當你的情況足夠簡單時,它很方便,但它可能帶有約束的主要問題。 https://code.djangoproject.com/ticket/14268鏈接到一些細節,並注意「重置個人表是一個難題;在這種情況下,Django不能替代一個好的DBA。」 –

2

syncdb不會添加新列,如果表已經存在,它不會創建任何新表。我以前做的事情就是在模型中添加字段名稱之後。在殼體內輸入:

$ python manage.py dbshell 

you will get directly within your database shell (mysql or psql) it up to what database 
you are using. 

mysql> | psql> ALTER TABLE <table_name> ADD column varchar(100); 

and it will add the new column to your table, doesn't matter if the table it already populated or not.