Django 數據表更改

我們設計數據庫的時候,早期設計完后,后期發現不完整,要對數據表進行更改,這時候就要用到本屆的知識。

Django 1.7.x和后來的版本:

Django1.7.x及以后的版本繼承了South的功能,在修改models.py了后運行:

python manage.py makemigrations
python manage.py migrate

這兩行命令就會對我們的models.py進行檢測,自動發現需要改進的,應用到數據庫中去。

Django1.6.x及以前:

寫過Django項目的同學,必然后遇到這個問題:
在Django1.6及以前的版本中,我們測試,當代縣model要改,怎么辦?
我們修改了models.py之后,我們運行:

python manage.py syncdb

這句話將我們在models.py中新加的類創建響應的表

對于原有的,現在刪除了的類,Django會詢問是否要刪除數據庫中已經存在的相關數據表

如果在原來的類上增加字段或者刪除字段,可以參考這個命令

python manage.py sql appname

給出得 SQL語句,然后自己手動到數據庫執行SQL,但是這樣非常容易出錯

Django 的第三方app south 就是專門做數據庫表結構自動遷移工作JacobKaplan-Moss 曾做過一次調查,South名列最受歡迎的而第三方app,事實上,他現在已經成為Django數據庫表遷移標準,很多第三方app都會帶South migratins腳本,Django1.7中繼承了South的功能。

1、安裝South

student@student-VirtualBox:~$ sudo pip install 
[sudo] password for student: 
student@student-VirtualBox:~$ sudo pip install South
[sudo] password for student: 
Downloading/unpacking South
  Downloading South-1.0.2.tar.gz (96Kb): 96Kb downloaded
  Running setup.py egg_info for package South
    
Installing collected packages: South
  Running setup.py install for South
    
Successfully installed South
Cleaning up...
student@student-VirtualBox:~$ 

2、使用方法
一個好的程序使用起來必定是簡單的,South和它的宗旨一樣,使用簡單,只需要簡單幾步,針對已經建好的model和創建完表的應用

把south 加入到settings.py中的INSTALL_APPS中

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
    'south',
]

修改好后運行一次,python manage.py syncdb,Django會新建一個south_migrationhistory表,用來記錄數據表更改(
Migration)的歷史記錄

$ python manage.py syncdb
Syncing...
Creating tables ...
Creating table south_migrationhistory
Installing custom SQL ...
Installing indexes ...
No fixtures found.
 
Synced:
 > django.contrib.admin
 > django.contrib.auth
 > django.contrib.contenttypes
 > django.contrib.sessions
 > django.contrib.messages
 > django.contrib.staticfiles
 > blog
 > south
 
Not synced (use migrations):

如果要把之前建好號的比如blog 這個app使用South來管理:

$ python manage.py convert_to_south blog

你會發現blog文件夾中多了一個 migrations 目錄,里面有一個 0001_initial.py 文件。

注:如果 blog 這個 app 之前就創建過相關的表,可以用下面的來“假裝”用 South 創建(偽創建,在改動 models.py 之前運行這個)

python manage.py migrate blog --fake

意思是這個表我以前已經建好了,用 South 只是紀一下這個創建記錄,下次 migrate 的時候不必再創建了。

原理就是 south_migrationhistory 中記錄下了 models.py 的修改的歷史,下次再修改時會和最近一次記錄比較,發現改變了什么,然后生成相應的對應文件,最終執行相應的 SQL 更改原有的數據表。

接著,當你對 Blog.models 做任何修改后,只要執行:

$ python manage.py schemamigration blog --auto

South就會幫助我們找出哪些地方做了修改,如果你新增的數據表沒有給default值,并且沒有設置null=True, south會問你一些問題,因為新增的column對于原來的舊的數據不能為Null的話就得有一個值。順利的話,在migrations文件夾下會產生一個0002_add_mobile_column.py,但是這一步并沒有真正修改數據庫的表,我們需要執行 python manage.py migrate :

$ python manage.py migrate
Running migrations for blog:
 - Migrating forwards to 0002_add_mobile_column.
 > blog:0002_add_mobile_column
 - Loading initial data for blog.
No fixtures found.

這樣所做的更改就寫入到了數據庫中了。

恢復到以前

South好處就是可以隨時恢復到之前的一個版本,比如我們想要回到最開始的那個版本:

> python manage.py migrate blog 0001
 - Soft matched migration 0001 to 0001_initial.
Running migrations for blog:
 - Migrating backwards to just after 0001_initial.
 < blog:0002_add_mobile_column

這樣就搞定了,數據庫就恢復到以前了,比你手動更改要方便太多了。

####### django1.7后集成south的使用方法
對于app間有依賴關系的初始化,先在settings中將其他app注掉,同步主表,然后再打開其他app同步
1、初始部署代碼,初始化數據庫,建表但沒有對app注冊migratie

python manage.py makemigrations
python manage.py migrate
# 此時字段并不能被migrate檢測到,無法變更字段,
此命令作為整個工程初始化數據庫是使用,主要用于
初始化User等標準庫

2、對已有數據庫的app轉化為migrate

python manage.py makemigrations app_name
python manage.py migrate app_name --fake-inital
# 即可初始化。之后app中字段變動有以下兩中方式修改

# a) 修改所有注冊過migrate的app
python manage.py makemigrations
python manage.py migrate

# b)單獨修改APP
python manage.py makemigrations app_name
python manage.py migrate  app_name

3.新增app,還未創建數據庫的

python manage.py makemigrations app_name
python manage.py migrate  app_name

4.對于工具類app的model,不需要修改,則不需要注冊migrate

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容