django中表变更后migrate无效的问题

本文详细解析了在Django项目中遇到的迁移问题,当原有的model修改后重新生成migrations时,可能会出现Nomigrationstoapply错误。文章给出了具体的排查过程及解决办法,并深入分析了问题的根本原因。

问题描述:

已有的model,修改之后,想重新建模,于是将migrations文件夹中除__init__.py之外其他文件都删掉,再次执行以下步骤python manage.py makemigrations确认成功,执行python manage.py migrate,提示No migrations to apply. 表示一脸懵逼。再次修改,指定表名,再次尝试,发现问题依旧,表示二脸懵逼

排查过程

  1. python manage.py dbshell 进到数据库里面,查看是否表已存在
    结果:表不存在
  2. 检查migrations文件
    结果:文件没问题
  3. 百度 google 各种搜,乱投医,各种尝试

解决方案

  1. python manage.py dbshell 进到数据库中,执行delete from django_migrations where app='your_appname';
  2. python manage.py makemigrations(若migrations文件未删除,可不执行这一步)
  3. python manage.py migrate 好啦,大功告成

原因分析

  1. 查看django_migrations表结构
    建表语句:
    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);
  2. 原因
    造成多次应用migrations失败的原因是,当前model是修改过的,原来的migrations已经被我删除,但是,重新生成的migrations使用递增整数记名,所以,在django_migrations表中0001,0002等前面几个数字的文件都已被记录,在Django看来,被记录了就相当于已应用,所以,会出现刚开始的No migrations to apply.

避免方案

  1. 有强迫症删除migrations文件的同学(比如我),请同时到数据库中删除相应记录
  2. 没有强迫症的同学,可以继续生成新的migrations,旧的就不必理会了

题外话

执行python manage.py migrate之后,可以使用python manage.py sqlmigrate appname migrations_num(例如python manage.py sqlmigrate user 0002)查看当前migrations文件对应的sql语句。
另外,在使用上述命令查看0002文件的sql语句时发现,django会新建一个表user_new,然后插入user表中的数据,再把user表删掉,再把user_new重命名为user。所以,修改model的时候,不必担心原有数据会丢失。

转载于:https://www.cnblogs.com/MayDayTime/p/9724837.html

这个错误是MySQL数据库的错误,通常发生在将外键关系添加到中时,父中并没有该外键对应的记录。 在Django中,修改自带的User模型后,有可能会添加新的外键字段,而在创建该字段的记录时,给定的外键值在关联中并不存在,就会触发这个错误。可能的原因有: 1. 在添加外键字段之前,没有先将关联中的对应记录添加进去; 2. 添加外键字段时,给定的外键值错误,与关联中的主键值不匹配; 3. 关联的主键值被删除了,导致外键值无效。 为解决这个问题,需要检查并确保以下事项: 1. 检查关联是否有对应的记录,如果没有则先将其添加到关联; 2. 检查关联中的对应记录的主键值是否正确,与外键字段的值匹配; 3. 如果关联的主键值被删除了,可能需要回滚之前的操作,重新创建关联中的记录。 此外,还可以尝试以下方法: 1.数据库操作之前,确认数据库连接是否正常,确保结构已经正确迁移到数据库中; 2. 使用Django提供的命令行工具`python manage.py makemigrations`生成数据迁移文件,再使用`python manage.py migrate`将变更应用到数据库中; 3. 查看相关模型字段的定义,确认没有漏掉或错误配置字段的相关信息。 如果以上方法无效,那可能需要更详细地检查和调试代码,以确定错误的具体来源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值