【Python】Django刪除數據遷移記錄


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等數據庫,反過來也可以。

缺點:數據量大的時候,速度相對較慢,表的關系比較復雜的時候可以導入不成功。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM