本文轉自:牆外行人
先說句閒話,Git真是深似海…
總所周知Django對數據庫的操作包裝做的非常靚,絕大數對數據庫的訪問全都轉變成了普通的對象訪問,對Web編程而言確實是個福音吧。Manage.py中有個syncdb命令就體現出了這個意思,但是這個命令也有個缺陷:即只能創建新表,而不能對舊錶做修改。什麼意思呢?就是如果你一開始新建了一個Model,裏面有個屬性比如說Char的長度是10,後來你想改成100,只用syncdb命令是辦不到,據我所知其他命令也不行,只能直接對數據庫進行操作。另外,一旦數據庫變得很龐大,據說有個South可以很好的處理這方面的問題,還沒仔細看過,以後再說。
爲了講清楚怎麼更新數據庫,我們還是以例子爲例子。假如一開始你有個models.py如下:
from
django.db import
models class
Book(models.Model): name
=
models.CharField(max_length =
10 )
|
在該Web文件的根目錄下執行:
python
manage.py sqlall book > book.old.sql |
該book.old.sql文件長成這樣:
BEGIN; CREATE
TABLE `book_book` ( ` id `
integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name`
varchar( 10 )
NOT NULL ) ; COMMIT; |
此時因爲一些需求,你得把Book類的中name變量的max_length改成100,直接修改文件是不行的,你還得同步到數據庫中;經上面所述我們必須得對數據庫進行直接操作,所以修改完Book類之後,我們以同樣的方式生成book.new.sql。執行以下命令得到兩次的區別:
diff
book.old.sql book.new.sql > book.update.sql |
之後也許我們得有一點點數據庫的操作知識,根據每個不同點,修改爲對數據庫的修改操作,如上面的例子,我們可以修改book.update.sql文件爲如下update.sql文件:
use
xxx; alter
table book_book modify column name varchar( 100 )
; |
其中第一行表示我們要操作的數據庫名字,由xxx表示;第二行是根據剛纔的book.update.sql文件,發現區別有varchar的長度,根據mysql的語法,我們簡單修改爲修改語句即可。接着我們只需要執行下面語句,即可完成對數據庫的更新:
mysql
- u
root - p
< update.sql |
當然以上的操作還是有些煩,但是很多時候還是很實用的,比如你偶爾加一個變量只需要該成add column,偶爾加一個Model類什麼的就什麼都不要改動。