django使用migrations迁移版本和数据库中报错解决方案

你的名字 2021-12-24 15:25 673阅读 0赞

1、到数据库表django_migrations中查看app中看看app列

1061145-20190322005828621-1325290301.png

2、到项目对应的app模块中打开migrations文件查看生成的文件与数据库app列中的是不是一样

1061145-20190322005921890-497350868.png

3.找到哪里不一致的文件,然后使用python manage.py --fake [版本名字],将这个版本标记为已经映射

如果还是报错就按照下面执行

  1. 1、删除指定appmigrations和数据库表django_migrations中和这个app相关的版本号,
  2. 2、将模型中的字段和数据库中的字段保持一致,再使用命令python manage.py makemigrations重新生成一个初始化的迁移脚本。
  3. 3、再使用命令python manage.py makemigrations --fake-initial来将这个初始化的迁移脚本标记为已经映射。之后再修改就没有问题了。
  4. 更多关于迁移脚本的。请查看官方文档:https://docs.djangoproject.com/en/2.0/topics/migrations/

makemigrations和migrate时django都做了什么?

  1. makemigrations
  2. 执行makemigrations时检测models文件变化,在migrations文件夹中生成变更的sqlpy文件
  3. migrate:检测django_migrations表,迁移过的表会记录在其中并不再执行migrate,未找到执行记录则进行migrate

不要随意删除django项目目录下的 migrations文件夹,里面会记录models文件每次makemigrations操作,误删后,makemigrations会重新生成

  1. #执行python manage.py makemigrations命令时报错问题及解决办法:
  2. 在修改了models.py后,有些用户会喜欢用python manage.py makemigrations生成对应的py代码。
  3. 但有时执行python manage.py makemigrations命令(也可能人比较皮,把migrations文件夹给删了),会提示"No changes detected." 可能有用的解决方式如下:
  4. python manage.py makemigrations --empty yourappname 生成一个空的initial.py
  5. python manage.py makemigrations 生成原先的model对应的migration file

django-关于manage.py migrate无效的问题

  1. 问题描述:
  2. 已有的model,修改之后,想重新建模,于是将migrations文件夹中除__init__.py之外其他文件都删掉,再次执行以下步骤python manage.py makemigrations确认成功,执行python manage.py migrate,提示No migrations to apply. 表示一脸懵逼。再次修改,指定表名,再次尝试,发现问题依旧,表示二脸懵逼
  3. 排查过程
  4. python manage.py dbshell 进到数据库里面,查看是否表已存在
  5. 结果:表不存在
  6. 检查migrations文件
  7. 结果:文件没问题
  8. 百度 google 各种搜,乱投医,各种尝试
  9. 解决方案
  10. python manage.py dbshell 进到数据库中,执行delete from django_migrations where app='your_appname';
  11. python manage.py makemigrations(若migrations文件未删除,可不执行这一步)
  12. python manage.py migrate 好啦,大功告成
  13. 原因分析
  14. 查看django_migrations表结构
  15. 建表语句:
  16. CREATE TABLE "django_migrations" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "app" varchar(255) NOT NULL, "name" varchar(255) NOT NULL, "applied" datetime NOT NULL);
  17. 原因
  18. 造成多次应用migrations失败的原因是,当前model是修改过的,原来的migrations已经被我删除,但是,重新生成的migrations使用递增整数记名,所以,在django_migrations表中00010002等前面几个数字的文件都已被记录,在Django看来,被记录了就相当于已应用,所以,会出现刚开始的No migrations to apply.
  19. 避免方案
  20. 有强迫症删除migrations文件的同学(比如我),请同时到数据库中删除相应记录
  21. 没有强迫症的同学,可以继续生成新的migrations,旧的就不必理会了
  22. 题外话
  23. 执行python manage.py migrate之后,可以使用python manage.py sqlmigrate appname migrations_num(例如python manage.py sqlmigrate user 0002)查看当前migrations文件对应的sql语句。
  24. 另外,在使用上述命令查看0002文件的sql语句时发现,django会新建一个表user_new,然后插入user表中的数据,再把user表删掉,再把user_new重命名为user。所以,修改model的时候,不必担心原有数据会丢失。

转载于:https://www.cnblogs.com/yum777/p/10575851.html

发表评论

表情:
评论列表 (有 0 条评论,673人围观)

还没有评论,来说两句吧...

相关阅读