django系列9 --- 迁移相关

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 migrations

class Migration(migrations.Migration):
    atomic = False

6 依赖

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

7 迁移文件

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    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 migrations

def 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.py
  You should commit this migration but leave the old ones in place;
  the new migration will be used for new installs. Once you are sure
  all instances of the codebase have applied the migrations you squashed,
  you can delete them.

14 序列化值(ing)

15 支持多个django版本(ing)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: `django-admin startproject mybbs` 是一个 Django 命令,用于创建一个名为 `mybbs` 的 Django 项目。这条命令在终端中输入,并在当前目录下生成一个包含项目模板的新目录 `mybbs`。项目模板包含一系列文件和目录,这些文件和目录提供了 Django 项目的基础结构和功能。你可以在这个新目录中开发你的 Django 应用。 例如,如果你想创建一个名为 `mybbs` 的 Django 项目,你可以在终端中输入: ``` django-admin startproject mybbs ``` 然后,Django 会在当前目录下生成一个名为 `mybbs` 的目录,该目录包含了项目模板文件和目录。 ### 回答2: django-admin startproject mybbs是用于创建一个名为mybbs的Django项目的命令。Django是一个基于Python的高级Web框架,它提供了许多强大的工具和功能来简化Web应用程序的开发过程。 执行这个命令后,Django将会在当前目录下创建一个名为mybbs的文件夹,这个文件夹将作为项目的根目录。在这个根目录下,Django会自动生成一些必要的文件和目录,包括一个名为manage.py的Python脚本文件,以及一个名为mybbs的子目录。 manage.py是项目的命令行工具,通过它可以执行各种Django相关的操作,如运行开发服务器、创建数据库等。mybbs子目录是项目的主要代码目录,其中包含了一些重要的文件和目录,如settings.py、urls.py和wsgi.py等。 settings.py是项目的配置文件,其中包含了项目的一些基本设置,如数据库连接、静态文件路径、模板路径等。通过编辑这个文件,可以对项目的基本配置进行修改。 urls.py是项目的URL路由配置文件,它定义了URL和视图函数之间的映射关系。通过编辑这个文件,可以定义项目的各个URL路径以及对应的视图函数。 wsgi.py是项目的Web服务器接口文件,它定义了如何将Django项目与Web服务器连接起来。这个文件一般不需要手动编辑,系统会自动生成并提供默认的配置。 总之,执行django-admin startproject mybbs命令之后,将会创建一个名为mybbs的Django项目,该项目包含了一些必要的文件和目录,可以通过编辑这些文件来配置项目的各项设置。 ### 回答3: 执行该命令“django-admin startproject mybbs”可以创建一个名为mybbs的Django项目。这个命令会在当前目录下创建一个名为mybbs的项目文件夹,并在文件夹中生成一些必需的文件和目录。 在mybbs文件夹中,会生成一个manage.py文件,这是一个用于管理项目的命令行工具。通过它,我们可以执行各种与项目相关的操作,如启动开发服务器、执行数据库迁移等。 此外,mybbs文件夹中还会生成一个名为“mybbs”的子文件夹,它是项目的主要目录,我们在这个目录下进行开发工作。 在mybbs子文件夹中,会生成一个名为“settings.py”的文件,它是项目的配置文件,我们可以在这个文件中对项目进行各种配置,如数据库设置、静态文件路径等。 同时,在mybbs子文件夹中,还会生成一个名为“urls.py”的文件,它是项目的URL配置文件,我们可以在这个文件中定义URL与视图函数之间的映射关系,用于处理用户请求。 总而言之,通过执行“django-admin startproject mybbs”命令,我们可以快速创建一个Django项目,为后续的开发工作打下基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿_焦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值