django迁移文件migrations的实现

 更新时间:2020年03月31日 15:39:40   作者:程序-缘  
这篇文章主要介绍了django迁移文件migrations的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

当模型models.py中发生改变时,即在models.py文件操作数据表,使得数据库中的表结构发生变化,需要使用命令,记录这些操作,类似于日记。

修改完models.py后,先在Terminal下执行命令

python manage.py makemigrations

这是仅仅是生成迁移记录,执行过后,数据库中的表并未发生变化。若是models发生改变,但是执行以上命令,显示的是

No changes detected

则需要执行

python manage.py makemigrations + 你所改变的models.py所在的目录

然后,要想表结构发生变化,还要执行以下命令

python manage.py migrate

执行完毕后,数据库中的表结构已经改变

补充知识:django使用migrations迁移版本和数据库中报错解决方案

回滚django的migration:

https://stackoverflow.com/questions/32123477/django-revert-last-migration

I've made a migration that added a new table and want to revert it and delete the migration, without creating a new migration.

How do I do it? Is there a command to revert last migration and then I can simply delete the migration file?


You can revert by migrating to the previous migration.

For example, if your last two migrations are:

0010_previous_migration
0011_migration_to_revert
Then you would do:

./manage.py migrate my_app 0010_previous_migration 
You can then delete migration 0011_migration_to_revert.

If you're using Django 1.8+, you can show the names of all the migrations with

./manage.py showmigrations my_app
To reverse all migrations for an app, you can run:

./manage.py migrate my_app zero

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

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

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

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

1、删除指定app下migrations和数据库表django_migrations中和这个app相关的版本号,

2、将模型中的字段和数据库中的字段保持一致,再使用命令python manage.py makemigrations重新生成一个初始化的迁移脚本。

3、再使用命令python manage.py makemigrations --fake-initial来将这个初始化的迁移脚本标记为已经映射。之后再修改就没有问题了。

更多关于迁移脚本的。请查看官方文档:https://docs.djangoproject.com/en/2.0/topics/migrations/

makemigrations和migrate时django都做了什么?

makemigrations:

执行makemigrations时检测models文件变化,在migrations文件夹中生成变更的sql的py文件

migrate:检测django_migrations表,迁移过的表会记录在其中并不再执行migrate,未找到执行记录则进行migrate

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

#执行python manage.py makemigrations命令时报错问题及解决办法:

在修改了models.py后,有些用户会喜欢用python manage.py makemigrations生成对应的py代码。

但有时执行python manage.py makemigrations命令(也可能人比较皮,把migrations文件夹给删了),会提示"No changes detected." 可能有用的解决方式如下:

先 python manage.py makemigrations --empty yourappname 生成一个空的initial.py

再 python manage.py makemigrations 生成原先的model对应的migration file

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的时候,不必担心原有数据会丢失。

临时解决:

在models中添加了一个model,makemigrations成功后,如果migrate提示no apply --》查看django——migrations是否有对应model的name记录,如果没有记录 --》删除model,再次makemigrations、migrate(提示无表,数据库中手动创建对应表名)--》再添加model,再次makemigrations、migrate即可

上述问题出现的根因:项目目录下面没有留存/migrations/ 文件夹及迁移文件,导致,每次项目迁移记得保存好这个目录的文件

以上这篇django迁移文件migrations的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python strip() 函数和 split() 函数的详解及实例

    python strip() 函数和 split() 函数的详解及实例

    这篇文章主要介绍了 python strip() 函数和 split() 函数的详解及实例的相关资料,需要的朋友可以参考下
    2017-02-02
  • python读取excel指定列数据并写入到新的excel方法

    python读取excel指定列数据并写入到新的excel方法

    今天小编就为大家分享一篇python读取excel指定列数据并写入到新的excel方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • PyQt5实现仿QQ贴边隐藏功能的实例代码

    PyQt5实现仿QQ贴边隐藏功能的实例代码

    这篇文章主要介绍了PyQt5实现仿QQ贴边隐藏功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • python导入导出redis数据的实现

    python导入导出redis数据的实现

    本文主要介绍了python导入导出redis数据的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 一文掌握python中的__init__的意思及使用场景分析

    一文掌握python中的__init__的意思及使用场景分析

    __init__是构造方法,谁调用,表示谁(更直观的理解就是类的方法中,谁调用,表示谁,见下面第一个代码)!!并不是必选项,也就是说在类中,这个不是必须用的,那什么场景需要用到,什么场景不需要用到呢,感兴趣的朋友跟随小编一起看看吧
    2023-02-02
  • 基于Python中Remove函数的用法讨论

    基于Python中Remove函数的用法讨论

    这篇文章主要介绍了基于Python中Remove函数的用法讨论,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 利用插件和python实现Excel转json的两种办法

    利用插件和python实现Excel转json的两种办法

    转换Excel表格到JSON格式有很多方法,下面这篇文章主要给大家介绍了关于利用插件和python实现Excel转json的两种办法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Python制作七夕表白案例分享

    Python制作七夕表白案例分享

    这篇文章主要介绍了Python制作七夕表白案例分享,文章利用Python的基本操作实现七夕表白案例,需要的小伙伴可以参考一下
    2022-08-08
  • Python制作简易聊天器,搭建UDP网络通信模型

    Python制作简易聊天器,搭建UDP网络通信模型

    这篇文章主要介绍了Python制作简易聊天器,搭建UDP网络通信模型,用UDP建立网络模型来完成一个简单的聊天器,感兴趣的小伙伴可以参考一下,希望对你有所帮助
    2022-01-01
  • 利用Python校准本地时间的方法教程

    利用Python校准本地时间的方法教程

    这篇文章主要给大家介绍了关于如何利用Python校准本地时间的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10

最新评论