django项目在执行迁移数据库时遇到的问题


今天周日我又开始折腾我的blog项目了,项目是使用django,并部署在亚马逊EC2上,系统为ubuntu16.04。

调试过程是在我的mac上的虚拟机中完成的,虚拟机中的系统为ubuntu16.04,基本配置与我在EC2上的一致,我是在本地编写代码并测试的,完成后再push到github,服务器端pull后运行。

今天我主要移除了django自带的admin,并使用了自定义的admin,并添加了markdown中直接上传图片等功能,期间我新建并修改了部分models,在本地进行migrate并没有问题,但是当在服务器端migrate时,却报了各种错误。

当本地测试数据库和服务器数据库进度一致时,项目中每个app的migrations下的0001_initial.py也要保持一致;如果你的服务器的数据库中并没有我们项目中的这些表,也就是第一次生成数据库迁移时,此时不会出这种问题的。

下面是迁移数据库时遇到的错误和解决访问的方法:

問題:

  1. 當修改或新增model後, 執行python manage.py makemigrations,未生成遷移: 解決方法: 刪除每個app文件下migrations文件中除了init.py的所有文件,然後再執行python manage.py makemigrations重新生成遷移

  2. 數據庫遷移時遇見的問題: 錯誤信息:

    django.db.utils.InternalError: (1054, "Unknown column 'name' in 'django_content_type'")

    解決方法: 在数据库中手动添加没有创建的字段

    alter table django_content_type add column name varchar(10)
  3. 遷移數據庫python manage.py migrate時出錯:

    django.db.utils.InternalError: (1050, "Table 'auth_permission' already exists")

    解決方法:

    python manage.py migrate --fake

    但是此種方法會忽略一些錯誤,導致最終還是不能解決我們的遷移的問題

2018-3-4總結:

我的blog項目是在我的本地電腦ubuntu系統上開發並測試的,然後提交到github上,最後部署到亞馬遜服務器時,通過git命令clone到服務器上; 期間我在本地修改或創建了一些model,這時我在本地生成遷移和遷移時都沒有,但是在服務端遷移總是報錯,導致遷移失敗; 在網上查找各種資料最終都沒有解決,最後我發覺項目的.gitignore中忽略了migrations文件,而每次改變model或新增model時,都會生成一個000n_.py文件,每次改變n都會加1, 此時我的數據庫也會在遷移時發生改變,而當我在服務器執行遷移時,服務器端沒有migrations文件,每次遷移都會重新生成,那麼和本地執行時機不同,所以會需要每次執行遷移時,會根據migrations執行的結果也不同; 解決方法:當然我們可以在gitignore中取消這些忽略文件, 另外當我們在服務器段執行遷移遇到文件時,我們可以把本地的0001_initial.py中的復制到服務端對應的這個文件再

done

附件: