我創建了一個示例Django應用程序,其中包含多個模型和填充數據。在Django模型中添加新列
現在,我需要添加一個新的列到其中一個模型?
這是我的顧慮嗎?
- 如果在向模型添加一列後執行syncdb會發生什麼情況,它會改變表格並添加新列?
- 或者它會刪除所有的列後創建一個新的表?
有沒有更好的方法來解決這個問題?
我創建了一個示例Django應用程序,其中包含多個模型和填充數據。在Django模型中添加新列
現在,我需要添加一個新的列到其中一個模型?
這是我的顧慮嗎?
有沒有更好的方法來解決這個問題?
syncdb
不適用於更改數據庫表。 這裏是the documentation(電文讀出上:執行syncdb不會改變現有的表)
一個乾淨的方式來實現,這將是你的情況下,使用第三方工具,如django south這將處理遷移(小心使用ALTER TABLE腳本) 爲你。
這裏是南方step by step tutorial,這裏是official documentation on south
在發展中,我使用了復位功能很多。這對我很有用,因爲我不介意吹走開發數據。它基本上只爲該應用程序創建新的數據庫表 - 因此它將刪除您的數據。如果您希望保持數據填充,則無用,如上所述,南方更好。
python manage.py reset <app-name>
'reset'自1.5起棄用。當你的情況足夠簡單時,它很方便,但它可能帶有約束的主要問題。 https://code.djangoproject.com/ticket/14268鏈接到一些細節,並注意「重置個人表是一個難題;在這種情況下,Django不能替代一個好的DBA。」 –
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.
South已經成爲管理這個工具的主要工具,但您也可以修改您的模式以直接添加列。就像'alter table myapp_mymodel add column mycolumn integer;' - 或者什麼取決於你的數據類型和數據庫後端。這是不太可維護的,所以它不是首選的方法,但如果你只需要一個小的修改它是一個選項。 –
同意。尤其是當項目處於開發的早期階段,並且您仍在本地開發時,它是一個不錯的選擇 – karthikr
如果您最終確實手工完成更改,'python manage.py sql'會輸出sql Django會如果它正在爲應用程序創建表,請使用它。這對於保持列類型的一致性更重要,對於獲取外鍵約束和索引等更重要。 –