关于python:Django 1.7迁移不会重新创建丢弃的表,为什么?

Django 1.7 migrations won't recreate a dropped table, why?

使用django 1.7迁移。

我不小心在数据库中掉了一个表。我假设通过再次运行迁移,这将重新创建表,但不是,Django声明"没有要应用的迁移"。

如何让姜戈重新制作桌子?

我跑过:

1
2
> makemigrations - No changes detected
> migrate - No migrations to apply.

我尝试了对模型进行更改,并运行了一个新的迁移,它简单地说"表'x.test_customer'不存在",这是正确的,但我希望它能重新创建表。


转到数据库,找到表django_migrations。删除所有app等于应用程序名称的行。

那么做一个makemigrationsmigrate就行了。


我发现的另一个解决方案非常有效:

在Django 1.7中:

  • 删除迁移文件夹

  • 数据库中:DELETE FROM django_migrations WHERE app = 'app_name'

    您也可以直接截断这个表。

  • 埃多克斯1〔8〕

  • 埃多克斯1〔9〕

  • 在Django 1.9.5中:

  • 删除迁移文件夹
  • 数据库中:DELETE FROM django_migrations WHERE app = 'app_name'

    您也可以直接截断这个表。

  • 江户十一〔11〕。

  • 埃多克斯1〔12〕

  • 这对我来说100%有效!


    迁移检查模型中的差异,然后将其转换为操作,这些操作被转换为SQL。它不会自动将DB方案与您的模型同步,也不会知道您删除了一个表(它不知道手动更改,因为,好吧,您不应该进行手动更改)。这就是重点)

    答案是什么?手动更改也需要手动迁移。您需要做的只是编写自己的迁移,并手动告诉South重新构建表。这并不难,医生让这很容易。就这样做:

    1
    2
    3
    4
    5
    6
    7
    8
    from django.db import migrations, models

    class Migration(migrations.Migration):

        operations = [
            migrations.CreateModel("Foo"),
            migrations.AddField("Foo","bar", models.IntegerField(default=0))
        ]

    您可能可以查看第一个迁移文件(最初创建模型的文件)并复制粘贴几乎所有文件。那么你所要做的就是像往常一样运行迁移。


    我找到了一个更简单的方法。您假装回滚不存在的内容,然后重新迁移。如果迁移0005是它创建表的地方:

    1
    2
    python manage.py migrate myapp --fake 0004
    python manage.py migrate myapp

    之后应该会很好!

    如果您需要跳过以后的步骤,请执行以下操作:

    1
    2
    3
    python manage.py migrate myapp --fake 0004
    python manage.py migrate myapp 0005
    python manage.py migrate myapp --fake

    之后应该会很好!


    在django>=1.9上执行此操作的最简单方法是运行以下命令:

    1
    ./manage.py migrate app_name zero

    这将删除您的表并恢复所有迁移。


    完全免责声明,在某些情况下这是一个破坏性的操作,我主要使用它在不影响数据库的情况下重新迁移系统的部分。

    你试过通过表django_migrations来做吗?只需删除映射到应用程序标签的行和相关迁移名称,然后删除这些行。

    1
    2
    3
    4
    5
    6
    7
    8
    +----+-----------------------+----------------------------------------------------------+---------------------+
    | id | app                   | name                                                     | applied             |
    +----+-----------------------+----------------------------------------------------------+---------------------+
    |  1 | contenttypes          | 0001_initial                                             | 2015-03-07 16:32    |
    | 30 | homepage              | 0001_initial                                             | 2015-04-02 13:30:44 |
    | 31 | homepage              | 0002_auto_20150408_1751                                  | 2015-04-08 12:24:55 |
    | 32 | homepage              | 0003_remove_mappinghomepagemoduleinventory_inventoryinfo | 2015-04-09 08:09:59 |
    +----+-----------------------+----------------------------------------------------------+---------------------+

    所以现在,如果我想删除homepage,我可以只删除第30、31、32行。

    当然,既然你也把桌子掉了,你也需要换一下django_content_type

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    +----+----------------------------------------+-----------------------+--------------------------------------+
    | id | name                                   | app_label             | model                                |
    +----+----------------------------------------+-----------------------+--------------------------------------+
    |  1 | content type                           | contenttypes          | contenttype                          |
    |  2 | session                                | sessions              | session                              |
    |  3 | site                                   | sites                 | site                                 |
    | 92 | master_homepagemodule_extrafields      | homepage              | masterhomepagemoduleextrafields      |
    | 93 | mapping_homepagemodule_inventory       | homepage              | mappinghomepagemoduleinventory       |
    | 94 | master_homepagemodule_inventoryfields  | homepage              | masterhomepagemoduleinventoryfields  |
    | 95 | mapping_homepagemodule_inventoryfields | homepage              | mappinghomepagemoduleinventoryfields |
    | 96 | master_homepagemodule                  | homepage              | masterhomepagemodule                 |
    | 97 | mapping_homepagemodule_extrafields     | homepage              | mappinghomepagemoduleextrafields     |
    +----+----------------------------------------+-----------------------+--------------------------------------+

    因此,现在您必须删除这些表的行,从而删除需要重新迁移的表。

    当时间不多,我们需要快速修复时,或者在开发过程中四处玩耍时,我就使用了这个方法。希望它也能帮助你!


    只是在构建一个小应用程序学习Django时遇到了这个问题。我想为现有表创建一个非空列。有三个步骤:

  • 放下桌子
  • 删除django_迁移中的记录
  • 删除有关表的迁移
    • 如果在此步骤之前运行"python manage.py makemigrations posts",则仍然会得到"您正在尝试添加不可为空的字段"。
    • 小精灵

      对于实际的应用程序,您需要像其他人指出的那样提供一个默认值。


      在我的django 2.0.2中,为了重新创建删除的表,我需要在myapp中注释我的模型,然后使用--fake进行迁移,取消对模型的注释,然后不使用--fake进行迁移。与劳尔的回答有些不同:

    • 删除所需应用程序中的迁移文件
    • 感谢劳尔的回答:在数据库中:DELETE FROM django_migrations WHERE app = 'app_name'
    • models.py中的注释代码以及所有这些模型在viewssignals等中的使用(以防止错误)。
    • 埃多克斯1〔8〕
    • 埃多克斯1〔9〕
    • 取消对步骤3中的评论的评论
    • 埃多克斯1〔8〕
    • 不带--fake:python manage.py migrate迁移
    • 这样可以解决一些用户问题。


      好吧,所以我所做的并不是去搞移民。好像我每次都会因为移民而陷入麻烦。在这种情况下,尝试重放迁移让我一无所获。也许没有帮助,有一些南部年份的移民以及更新的1.7东西。

      环境:Postgres 9.3

      基本上,我将数据库的一个旧备份还原到一个空数据库中。然后,我在postgres管理实用程序中提出了恢复目标,并从每个表的描述中复制/粘贴了创建表(我只剩下4个)。切换到我的测试数据库,并在pg的sql实用程序中运行它。

      我不知道,如果你有问题的话,我认为手动删除一个表是不合理的(在我看来,如果我的ID字段的序列不起作用),只要你能忍受丢失数据。在那个用例中,迁移应该是有弹性的。