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

时间:2014-11-03 11:24:27

标签: python django django-1.7

使用Django 1.7迁移。

我不小心在我的数据库中删除了一个表。我假设通过再次运行迁移,这将重新创建表,但不,Django说“没有迁移要应用”。

如何让Django重新创建表格?

我跑了:

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

我尝试对模型进行更改并运行新迁移,它只是声明“Table'x.test_customer'不存在”这是正确的,但我希望它会重新创建表

10 个答案:

答案 0 :(得分:49)

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

然后做一个makemigrations& migrate可以使用。

答案 1 :(得分:21)

我找到并完美运作的另一种解决方案:

在django 1.7:

  1. 删除迁移文件夹

  2. 在数据库中:DELETE FROM django_migrations WHERE app = 'app_name'

    您也可以截断此表。

  3. python manage.py makemigrations

  4. python manage.py migrate --fake

  5. 在django 1.9.5中:

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

      您也可以截断此表。

    3. python manage.py makemigrations app_name

    4. python manage.py migrate

    5. 这对我来说是100%的工作!

答案 2 :(得分:19)

迁移检查模型中的差异,然后将其转换为转换为SQL的操作。 没有自动将db方案与您的模型同步,并且无法知道您丢弃了一个表(它不知道手动更改,因为,好吧,你是'不应该做手动更改。这就是重点)

答案是什么?手动更改还需要手动迁移。您需要做的只是编写自己的迁移并手动告诉south重新构建表。这不是很困难,The docs让它变得非常简单。做这样的事情:

from django.db import migrations, models

class Migration(migrations.Migration):

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

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

答案 3 :(得分:7)

我实际上找到了一种更简单的方法。你假设你回滚了不存在的东西,然后重新迁移。如果您的迁移0005是创建表的那个:

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

之后应该是好的!

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

python manage.py migrate myapp --fake 0004
python manage.py migrate myapp 0005
python manage.py migrate myapp --fake

之后应该是好的!

答案 4 :(得分:2)

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

您是否尝试通过表django_migrations进行此操作?只需删除映射到应用标签的行和相关的迁移名称,然后删除这些行。

+----+-----------------------+----------------------------------------------------------+---------------------+
| 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

+----+----------------------------------------+-----------------------+--------------------------------------+
| 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     |
+----+----------------------------------------+-----------------------+--------------------------------------+

所以现在你必须通过删除那些表的行来删除需要重新引导的表。

我在时间不足时使用了这个,我们需要快速修复,或者在开发中玩耍 希望它也能帮到你!

答案 5 :(得分:2)

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

./manage.py migrate app_name zero

这将删除您的表并还原所有迁移。

答案 6 :(得分:0)

好的,所以我所做的就是不要搞乱迁移。似乎我经常在迁移时遇到麻烦。在这种情况下,尝试重播迁移让我无处可去。可能没有帮助,有一些南方的老式迁移以及更新的1.7东西。

环境:postgres 9.3

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

我不知道,如果你遇到问题,我不认为手动放桌子是不合理的(看着我好像我的id字段序列不起作用),只要你可以忍受失去你的数据。迁移应该在该用例中具有弹性。

答案 7 :(得分:0)

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

  1. 在所需的应用中删除迁移文件
  2. 感谢劳尔回答:在数据库中:--fake
  3. DELETE FROM django_migrations WHERE app = 'app_name'中的注释代码,以及所有这些模型在models.pyviews等中的用法(以防止错误)。
  4. signals
  5. python manage.py makemigrations YOUR_APP_NAME
  6. 取消评论您在第3步中发表的评论
  7. python manage.py migrate --fake
  8. 不带--fake 迁移python manage.py makemigrations YOUR_APP_NAME

这应该可以解决一些用户问题。

答案 8 :(得分:0)

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

  1. 放下桌子
  2. 删除django_migrations中的记录
  3. 删除有问题的表的迁移
    • 如果在此步骤之前运行“ python manage.py makemigrations posts”,您仍会收到“您正在尝试添加不可为空的字段”

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

答案 9 :(得分:0)

可能是最简单的方法。

  1. 复制要迁移的迁移文件,并将其重命名为最新的迁移文件

例如如果您要迁移的文件是struct,而您最新的迁移文件是app_name.002_xyz

然后,您需要复制app_name.004_abc并将其重命名为最新的迁移文件。例如,让我们将其重命名为app_name.002_xyz

  1. 现在在该新文件中添加最新的最新内容作为依赖项

例如将此行添加到新的迁移文件中

app_name.005_xyz
  1. 迁移

例如将此行添加到新的迁移文件中

class Migration(migrations.Migration):

    dependencies = [
        ('app_name', 'app_name.004_abc'),
    ]
    
    ...
  1. 太棒了,进行了新的迁移并重新创建了表

例如

python manage.py migrate app_name
  1. 删除新的迁移文件Running migrations: Applying app_name.005_xyz...OK ,一切就好!