迁移相关

  • 1 简述
  • 2 命令
  • 3 后端相关
    • 3.1 mysql
    • 3.2 pt sql
    • 3.3 sqlite
  • 4 工作流程
  • 5 事务
  • 6 依赖
  • 7 迁移文件
    • 自定义字段(ing)
    • 模型管理器(ing)
    • 初始迁移(ing)
    • 历史一致性(ing)
  • 8 向应用添加迁移(ing)
  • 9 撤销迁移
  • 10 历史模型(ing)
  • 11 删除模型字段的注意事项(ing)
  • 12 数据迁移
  • 13 压缩迁移
  • 14 序列化值(ing)
  • 15 支持多个django版本(ing)

1 简述

迁移 是 django将你对models.py文件的修改(增添字段、增删模型 > 改变数据库表结构的代码操作)应用到数据库结构中的方式,它是自动完成的。
迁移 是数据库架构(数据库中的表格)的版本控制系统,迁移共2步,先用 makemigrations 将模型修改打包到肚里的迁移文件中, migrate将修改同步到数据库

2 命令

  • makemigrations:基于模型的修改生成迁移脚本,在当前引用的 migrations 目录下
  • migrate:应用和撤销迁移
  • sqlmigrate:查看迁移脚本的内容,里面是迁移使用sql语句
  • showmigrations:列出项目的迁移和迁移状态

3 后端相关

3.1 mysql

  1. MySQL 缺乏对架构变更操作相关事务的支持,这意味着如果迁移失败,你将必须手动取消更改才能重试(无法回滚到较早的时间)
  2. MySQL 几乎每一次架构操作都会完全重写表,增加或删除列需要的时间与表的行数成正比,在一个有几百万行的表中添加几列,可能会让你的网站锁定十几分钟。
  3. 对列、表和索引的名称长度有较小限制,意味着在其他后端上创建的索引将可能无法在mysql下创建

3.2 pt sql

  1. 在架构支持方面是所有数据库中是最强的。
  2. 建议你始终使用 null=True 创建新列,因为这样可以立即添加它们(在 PostgreSQL 11 之前,添加具有默认值的列会导致表的完全重写,时间长短与表的大小成正比)

3.3 sqlite

不建议你在生产环境中运行和迁移 SQLite,
Django 自带的支持是为了让开发人员在本地计算机上使用 SQLite 来开发较不复杂的 Django 项目,而无需完整的数据库。

4 工作流程

  1. 修改模板(添加一个字段、删除一个模型)
  2. 生成迁移文件用于改变数据库表结构:python manage.py makemigrations
  • makemigrations工具开始扫描最新模型与迁移文件版本比较,基于之前的版本生成新的迁移文件。
  • 改变迁移文件名:python manage.py makemigrations --name changed_my_model your_app_label
  1. 改变数据库表结构:python manage.py migrate

一旦我们应该用了迁移文件,那么应该将迁移和模型的更改作为一个单一的提交,这就像版本控制系统。

  1. 版本控制

其他人也提交了迁移文件,编号跟我相同,django会自动线性化两个迁移。

5 事务

sqllite、ptsql中,所有迁移操作默认在一个事务中运行,通过atomic属性设置False防止迁移在事务中运行,例如:

from django.db import migrationsclass Migration(migrations.Migration):atomic = False

6 依赖

你将B应用迁移到数据库成功创建了foreignkey引用的表,而A应用要想迁移到数据库成功,会使用这张表,所以B应用的迁移在A应用之前。存在一些这样的依赖关系

7 迁移文件

from django.db import migrations, models
import django.db.models.deletionclass Migration(migrations.Migration):initial = Truedependencies = []operations = [migrations.CreateModel(name='Question',fields=[('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),('question_text', models.CharField(max_length=200)),('pub_date', models.DateTimeField(verbose_name='data published')),],),migrations.CreateModel(name='Choice',fields=[('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),('choice_text', models.CharField(max_length=200)),('votes', models.IntegerField(default=0)),('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='polls.question')),],),]

django加载迁移文件,会在当前应用的migrations下寻找 django.db.migrations.Migration 的子类,这个子类有个固定命名 Migration,然后
检查类的四个属性,经常用到2个:

  1. dependencies 所依赖的迁移列表
  2. operations 是列表,包含了此次迁移操作的 Operation 类。

operations 是一组指令,指导了如何变更数据库表结构。django扫描它并构建所有应用的所有架构变更,然后使用它生成架构变更的原生sql语句。django运行时
makemigrations时候,会与你上次生成文件进行比较,最终计算出你改变了什么表结构。

自定义字段(ing)

模型管理器(ing)

初始迁移(ing)

历史一致性(ing)

8 向应用添加迁移(ing)

python manage.py makemigrations your_app_label
python manage.py migrate --fake-initial

9 撤销迁移

  1. 撤销上一次迁移,例如输入你的迁移编号0002:python manage.py migrate books 0002
  2. 撤销一个应用的所有迁移:python manage.py migrate books zero

10 历史模型(ing)

11 删除模型字段的注意事项(ing)

class IPAddressField(Field):system_check_deprecated_details = {'msg': ('IPAddressField has been deprecated. Support for it (except ''in historical migrations) will be removed in Django 1.9.'),'hint': 'Use GenericIPAddressField instead.',  # optional'id': 'fields.W900',  # pick a unique ID for your field.}

12 数据迁移

迁移还可以用来改变数据库本身的数据:

  1. 制作一个可以使用的空迁移文件:python manage.py makemigrations --empty yourappname
  2. 编写一个迁移,使用 first_name 和 last_name 的组合值填充新的 name 字段,使用历史模型进行迭代:
from django.db import migrationsdef combine_names(apps, schema_editor):Person = apps.get_model('yourappname', 'Person')for person in Person.objects.all():person.name = '%s %s' % (person.first_name, person.last_name)person.save()class Migration(migrations.Migration):dependencies = [('yourappname', '0001_initial'),]operations = [migrations.RunPython(combine_names),]

13 压缩迁移

压缩迁移:将一组现有的多个迁移减少到一个迁移,这些迁移仍然代表相同的更改
自定义迁移名称: squashmigrations --squashed-name

$ ./manage.py squashmigrations myapp 0004
Will squash the following migrations:- 0001_initial- 0002_some_change- 0003_another_change- 0004_undo_something
Do you wish to proceed? [yN] y
Optimizing...Optimized from 12 operations to 7 operations.
Created new squashed migration /home/andrew/Programs/DjangoTest/test/migrations/0001_squashed_0004_undo_something.pyYou should commit this migration but leave the old ones in place;the new migration will be used for new installs. Once you are sureall instances of the codebase have applied the migrations you squashed,you can delete them.

14 序列化值(ing)

15 支持多个django版本(ing)

django系列9 --- 迁移相关相关推荐

  1. Django数据库报错相关问题总结(初始化、迁移等)

    整理学习Django过程中遇到的问题 如何新建用户 新建超级用户 python manage.py createsuperuser 在命令行中依次输入用户名.邮箱地址(选填,可为空).密码.二次确认密 ...

  2. django 默认查询条件_Python之Django系列-创建第一个应用-4

    上一篇:Python之Django系列-创建第一个应用-3 上一篇文章我们介绍了创建项目,打开浏览器访问http://127.0.0.1:8000/polls/,能看见"投票主页视图&quo ...

  3. Django 系列博客(二)

    Django 系列博客(二) 前言 今天博客的内容为使用 Django 完成第一个 Django 页面,并进行一些简单页面的搭建和转跳. 命令行搭建 Django 项目 创建纯净虚拟环境 在上一篇博客 ...

  4. Django 系列博客(十一)

    Django 系列博客(十一) 前言 本篇博客介绍使用 ORM 来进行多表的操作,当然重点在查询方面. 创建表 实例: 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日 ...

  5. SAP PM 初级系列16 - 设备相关的Asset号

    SAP PM 初级系列16 - 设备相关的Asset号 业务上,由于很多维修部门的设备价值不菲,所以自然也是企业里的重要资产.在SAP系统里,为某个设备创建固定资产号,也是很正常的. IE03用于显示 ...

  6. SAP PM 初级系列3 - 主数据相关的基础设置

    SAP PM 初级系列3 - 主数据相关的基础设置 1,建立为用户状态授权的授权码 1.1, 该配置的帮助信息, Create Authorization Keys for User Status A ...

  7. Django系列目录

    一:搭建自己的博客系列  搭建自己的博客(一):前期准备  搭建自己的博客(二):创建表,创建超级用户  搭建自己的博客(三):简单搭建首页和详情页 搭建自己的博客(四):优化首页和详情页 搭建自己的 ...

  8. 使用Capistrano向EC2部署Django代码--关于SSH相关的配置

    使用Capistrano向EC2部署Django代码--关于SSH相关的配置 - foxracle - 博客园 使用Capistrano向EC2部署Django代码--关于SSH相关的配置 在使用Ca ...

  9. mysql子查询sysdate_Oracle向MySQL 迁移相关事项

    Oracle向MySQL 迁移相关事项 从Oracle移植到MySQL主要有六个方面的内容需要移植,一是表Table,包括表结构和数据,二是触发器Trigger,三是存储过程Procedure,函数f ...

  10. python 创建一个空向量_Python之Django系列-创建第一个应用-5

    上一篇:Python之Django系列-创建第一个应用-4 这一章我们会讲到视图层怎么与数据库操作并返回数据到模板层进行渲染最终显示在页面上 投票应用基本上会有这么几个视图 问题列表页 问题详情页 问 ...

最新文章

  1. drawable自定义字体颜色
  2. Docker 修改运行中的容器端口映射
  3. Spring MVC handler interceptors example--转载
  4. c#中获取服务器IP,客户端IP以及Request.ServerVariables详细说明
  5. API---有意思的API
  6. enum 定义3个属性_和平精英:合金龙骨有3个隐藏属性,比玛莎“水下无敌”还唬人...
  7. SpringBoot入门到精通_第1篇 _核心概念
  8. 镜像资源汇总 -- node依赖包下载缓慢或不成功的解决办法
  9. 初学 快速幂 的理解
  10. 造成ORA-01843 无效的月份 的一些原因
  11. arch linux编译,ArchLinux内核编译与安装
  12. javascript滚动栏响应鼠标滑轮的实现上下滚动事件
  13. vba自动生成html,动态生成嵌入在VBA电子邮件生成中的HTML表
  14. 格力集团投资小米,或是对董明珠和格力电器的复仇
  15. EIP-1559究竟在吵什么
  16. 《斯坦福极简经济学》读书笔记
  17. 【Eclipes安装Spring插件】
  18. 高数 | 极限定义函数 系列例题
  19. 小森生活服务器维护到几点,小森生活几点开服上线 2021小森生活开服表大全[多图]...
  20. 免费空间主机是什么?怎么申请免费空间主机

热门文章

  1. 题目72 好朋友的位置(ok)
  2. QT学习 实时显示时间
  3. 腾讯云联手腾讯安全玄武实验室,提供「应用克隆」漏洞免费检测服务
  4. Acer 4750 安装黑苹果_黑苹果系统安装教程之驱动篇
  5. 修复steam服务器失败怎么办,steam服务器失败
  6. 常用手机和平板的主流屏幕分辨率及适配注意项
  7. BZOJ 1213 HNOI2004 高精度开根 二分+高(Py)精(thon)度
  8. Servlet过滤器
  9. 小米mini php,小米路由器mini刷华硕固件的教程
  10. STM32F401标准固件库配置