find . -path "*migrations*" -name "*.py" -not -path "*__init__*" -exec rm {} \;
djang data migration
在使用django框架開發的過程中,我們不可避免的遇到models層的變更,就涉及到數據庫表的變動,django給我提供了一個migration的工具來做這些數據庫表的變更。
djang migration
如果不加appname,那么就是指所有包含migrations 目錄的app
# 基於當前的model 檢測修改,創建遷移策略文件 python manage.py makemigrations <appname> # 執行遷移動作 python manage.py migrate
migrations失敗
有時候如果models改動比較大,migrations會失敗,這個時候有兩種選擇,手工去修改migrations文件,第二種是清除所有migrations,重新migrate
手工修改migrations文件
通過報錯信息加上SQL語句找到找到問題,然后具體問題具體分析,是修改數據庫里面的數據,還是修改migrations生成的腳本。
python manage.py migrate python manage.py sqlmigrate <appname> 0001
當處理模型修改的時候:
-
如果模型包含一個未曾在數據庫里建立的字段,Django會報出錯信息。 當你第一次用Django的數據庫API請求表中不存在的字段時會導致錯誤。
-
Django不關心數據庫表中是否存在未在模型中定義的列。
-
Django不關心數據庫中是否存在未被模型表示的table。
在使用SQLite3數據庫時, 因為SQLite3 不支持刪除列操作,只有有限地 ALTER TABLE 支持,所以修改數據庫列的操作被新建表然后select into newtable 代替,所以會存在更多問題
參考
http://www.tuicool.com/articles/yM3IVr
NULL to NOT NULL
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的情況
清除migrations
清除所有app目錄/migrations/下除__init__.py 文件之外的py文件
find . -path "*migrations*" -name "*.py" -not -path "*__init__*" -exec rm {} \;
squashmigrations
當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等數據庫,反過來也可以。
缺點:數據量大的時候,速度相對較慢,表的關系比較復雜的時候可以導入不成功。