find . -path "*migrations*" -name "*.py" -not -path "*__init__*" -exec rm {} \;
在使用django框架開發的過程當中,咱們不可避免的遇到models層的變動,就涉及到數據庫表的變更,django給我提供了一個migration的工具來作這些數據庫表的變動。python
若是不加appname,那麼就是指全部包含migrations 目錄的appnginx
# 基於當前的model 檢測修改,建立遷移策略文件 python manage.py makemigrations <appname> # 執行遷移動做 python manage.py migrate
有時候若是models改動比較大,migrations會失敗,這個時候有兩種選擇,手工去修改migrations文件,第二種是清除全部migrations,從新migratesql
經過報錯信息加上SQL語句找到找到問題,而後具體問題具體分析,是修改數據庫裏面的數據,仍是修改migrations生成的腳本。shell
python manage.py migrate python manage.py sqlmigrate <appname> 0001
當處理模型修改的時候:數據庫
若是模型包含一個不曾在數據庫裏創建的字段,Django會報出錯信息。 當你第一次用Django的數據庫API請求表中不存在的字段時會致使錯誤。django
Django不關心數據庫表中是否存在未在模型中定義的列。json
Django不關心數據庫中是否存在未被模型表示的table。app
在使用SQLite3數據庫時, 由於SQLite3 不支持刪除列操做,只有有限地 ALTER TABLE 支持,因此修改數據庫列的操做被新建表而後select into newtable 代替,因此會存在更多問題框架
參考ide
http://www.tuicool.com/articles/yM3IVr
python manage.py makemigrations
You are trying to add a non-nullable field 'college' to majorproperty without a default; we can't do that (the database needs something to populate existing rows). Please select a fix: 1) Provide a one-off default now (will be set on all existing rows) 2) Quit, and let me add a default in models.py Select an option: 1 Please enter the default value now, as valid Python The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now() >>> 1
在migrate的時候提示你須要指定一個默認值,用以處理NULL的狀況
清除全部app目錄/migrations/下除__init__.py 文件以外的py文件
find . -path "*migrations*" -name "*.py" -not -path "*__init__*" -exec rm {} \;
當migrations愈來愈多的時候執行 makemigrations 和 migrate 就會愈來愈慢,能夠考慮對其瘦身(減小migrations文件的數量)
python manage.py squashmigrations schools 0002
django 項目提供了一個導出的方法 python manage.py dumpdata, 不指定 appname 時默認爲導出全部的app
python manage.py dumpdata [appname] > appname_data.json
數據導入,不須要指定 appname
python manage.py loaddata appname_data.json
優勢:能夠兼容各類支持的數據庫,也就是說,之前用的是 SQLite3,能夠導出後,用這種方法導入到 MySQL, PostgreSQL等數據庫,反過來也能夠。
缺點:數據量大的時候,速度相對較慢,表的關係比較複雜的時候能夠導入不成功。