【问题标题】:How would you create a 'manual' django migration?您将如何创建“手动”django 迁移?
【发布时间】:2018-05-13 21:57:10
【问题描述】:

我发现我可以使用migrations.RunSQL('some sql') 为 django 项目中的 postgres 数据库上的列设置默认值。

我目前通过添加列 makemigrations,然后删除列 makemigrations,然后手动修改生成的迁移文件来执行此操作。

我尝试复制一个旧的迁移文件,然后删除旧代码,以便只运行新的 sql 并得到一些奇怪的错误。

CommandError: Conflicting migrations detected; multiple leaf nodes in the migration graph: (0067_auto_20180509_2327, 0068_auto_20180514_0707 in csmu).
To fix them run python manage.py makemigrations --merge

您将如何创建“手动”django 迁移?

【问题讨论】:

标签: django django-migrations


【解决方案1】:

您可以通过运行以下命令来创建手动迁移:

python manage.py makemigrations --name migration_name app_name --empty

其中app_name 对应于您要添加迁移的项目中的应用程序。请记住 Django 管理项目和应用程序(项目是特定网站的配置和应用程序的集合。一个项目可以包含多个应用程序。一个应用程序可以在多个项目中。) --empty 标志是创建一个迁移文件,您必须在其中添加手动迁移。

例如,在一个项目中,您有一个名为api 的应用程序只有一个迁移文件0001_initial.py 正在运行:

python manage.py makemigrations api --name migration_example --empty

将在api/migrations/ 目录下创建一个名为0002_migration_example.py 的文件,如下所示:

# Generated by Django 2.2.10 on 2020-05-26 20:37

from django.db import migrations


class Migration(migrations.Migration):

    dependencies = [
        ('api', '0001_initial'),
    ]

    operations = [
    ]

您应该在操作括号内添加migrations.RunSQL('some sql').,例如:

    operations = [
      migrations.RunSQL('some sql')
    ]

【讨论】:

  • 迁移名称必须是有效的 Python 标识符。
  • 错误 --name 003_some_name 而不是 --name some_name。它会根据之前的迁移自动添加号码。
【解决方案2】:

您可以通过研究自动生成的迁移来了解如何进行迁移,例如:


class Migration(migrations.Migration):

    dependencies = [
        ('app_details', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            ...,
        ),
        migrations.CreateModel(
            ...,
        ),
        migrations.RenameModel(
            ...,
        ),
        migrations.RenameField(
            ...,
        ),
        migrations.RemoveModel(
            ...,
        ),
        # and so on
    ]


创建手动迁移文件

在终端中使用此命令:python manage.py makemigrations --empty。 然后在里面添加你想要的。

注意:您必须在“models.py”和手动迁移之间进行组合。

【讨论】:

    猜你喜欢
    • 2016-12-27
    • 2011-04-14
    • 1970-01-01
    • 2017-10-03
    • 2019-04-01
    • 2021-01-21
    • 2015-06-27
    • 1970-01-01
    • 2017-11-18
    相关资源
    最近更新 更多