django 解决manage.py migrate无效的问题

问题描述:

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

排查过程

python manage.py dbshell 进到数据库里面,查看是否表已存在

结果:表不存在

检查migrations文件

结果:文件没问题

百度 google 各种搜,乱投医,各种尝试

解决方案

python manage.py dbshell 进到数据库中,执行delete from django_migrations where app='your_appname';

python manage.py makemigrations(若migrations文件未删除,可不执行这一步)

python manage.py migrate 好啦,大功告成

原因分析

查看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); 

原因

造成多次应用migrations失败的原因是,当前model是修改过的,原来的migrations已经被我删除,但是,重新生成的migrations使用递增整数记名,所以,在django_migrations表中0001,0002等前面几个数字的文件都已被记录,在Django看来,被记录了就相当于已应用,所以,会出现刚开始的No migrations to apply.

避免方案

有强迫症删除migrations文件的同学(比如我),请同时到数据库中删除相应记录

没有强迫症的同学,可以继续生成新的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的时候,不必担心原有数据会丢失。

以上这篇django 解决manage.py migrate无效的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决

    一.现象 最近在数据库中删除了一张表,重新执行python manage.py migrate时出错,提示不存在这张表.通过查找相关的资料,最后找到了相关的解决方法,下面话不多说了,来一起看看详细的介绍吧 二.原因 主要是因为django一般在第一次迁移的时候新建表,后面的都不会新建表,而是只检查字段等等的变化,所以我们既然已经删除了这张表,django检查这张表的字段变化的时候就自然报错了. 三.解决办法 解决办法仍然是执行python manage.py makemigrations和pyt

  • django 解决manage.py migrate无效的问题

    问题描述: 已有的model,修改之后,想重新建模,于是将migrations文件夹中除__init__.py之外其他文件都删掉,再次执行以下步骤python manage.py makemigrations确认成功,执行python manage.py migrate,提示No migrations to apply. 表示一脸懵逼.再次修改,指定表名,再次尝试,发现问题依旧,表示二脸懵逼 排查过程 python manage.py dbshell 进到数据库里面,查看是否表已存在 结果:表不

  • 关于django python manage.py startapp 应用名出错异常原因解析

    如题,在控制台运行python manage.py startapp sales 建立一个应用报错异常 1.应用名不能包含下划线等字符 所以app-demo 不能作为应用名被定义 2.manage.py 报错 这时我们要打开manage.py文件 修改前: if name == "main": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangodeom.setting") from dj

  • Django执行python manage.py makemigrations报错的解决方案分享

    目录 1.环境 2. (No changes detected)及解决 2.1 问题情景 2.2 原因分析 2.3 修改方式 3. (2026, ‘SSL connection error:unknown error number‘) 及解决 3.1 问题情景 3.2 原因分析 3.3 解决方案 总结 1.环境 mysql 8.0 Django 3.2 pycharm 2021.11 2. (No changes detected)及解决 2.1 问题情景 # 迁移数据库 python mana

  • django如何自定义manage.py管理命令

    每次在启动Django服务之前,我们都会在终端运行python manage.py xxx的管理命令.其实我们还可以自定义管理命令,这对于执行独立的脚本或任务非常有用,比如清除缓存.导出用户邮件清单或发送邮件等等. 自定义的管理命令不仅可以通过manage.py运行,还可以通过Linux或Celery的crontab服务将其设成定时任务.本文主要讲解如何自定义Django-admin命令,并提供一些演示案例. 自定义Django-admin命令一共分三步:创建文件夹布局.编写命令代码和测试使用.

  • django 解决model中类写不到数据库中,数据库无此字段的问题

    如果你遇到了这个错误–MySQL Strict Mode is not set for database connection 'default' 还有这种错误,models中的代码 为什么会出现这种错误呢?有两种可能,一种settings少了options,一中是你的models文件中加了逗号 第一种可能 settings中需要添加以下字段 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mxs

  • Django 解决新建表删除后无法重新创建等问题

    起因 同步表的过程中,我手动将数据库中的一个表删除了,此时再去执行命令,发现不能再数据库中新建表了 修改了表结构以后执行python3 manage.py migrate 报错: No changes detected 所以进数据库把对应的表删除了,想着重新生成这张表. 删除表以后执行: python3 manage.py makemigrations python3 manage.py migrate 还是不能生成表,提示:No changes detected 处理过程 一.首先删除了app

  • django manage.py扩展自定义命令方法

    # django manage.py扩展自定义命令 环境: mac django1.10.3 在实际的项目开发过程中,我们可能要执行某脚本初始化数据库,可能要启动多个服务,比如启动celery,redis等.要是直接执行python mange.py celery/redis那该多方便啊!,能把这些命令整合到django框架的manage.py中吗? 示例-初始化数据 通过执行python manage.py initdata命令初始化数据,执行此命令后,调用某数据初始化脚本文件,进行数据初始化

  • django 解决扩展自带User表遇到的问题

    首先要扩展自带的auth_user表我就放个图吧, 同时setting中应该设置: # 此处重载是为了使UserProfile生效 AUTH_USER_MODEL = "EcdsApp.UserProfile" 本人的项目需要对此表进行扩展,再建两个子表关联这个表,关联关系为一对一: 修改完成之后进行子表关联: from django.contrib.auth.models import AbstractUser, User from django.conf import settin

  • Django解决frame拒绝问题的方法

    一.home页使用frame template/home.html <!DOCTYPE html> <html lang="en"> <meta http-equiv="Content-Type" content="text/html" charset="UTF-8"> <head> <title>自动化测试平台</title> </head>

  • Django自定义manage命令实例代码

    manage.py是在我们创建Django项目的时候就自动生成在根目录下的一个命令行工具,它可以执行一些简单的命令,其功能是将Django project放到sys.path目录中,同时设置DJANGO_SETTINGS_MODULE环境变量为当前project的setting.py文件. manage.py的代码是这样的: #!/usr/bin/env python import os import sys if __name__ == "__main__": os.environ.

随机推荐