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 1.7中:
删除迁移文件夹
数据库中:
您也可以直接截断这个表。
埃多克斯1〔8〕
埃多克斯1〔9〕
在Django 1.9.5中:
数据库中:
您也可以直接截断这个表。
江户十一〔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 |
。
这将删除您的表并恢复所有迁移。
完全免责声明,在某些情况下这是一个破坏性的操作,我主要使用它在不影响数据库的情况下重新迁移系统的部分。
你试过通过表
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 | +----+-----------------------+----------------------------------------------------------+---------------------+ |
。
所以现在,如果我想删除
当然,既然你也把桌子掉了,你也需要换一下
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时遇到了这个问题。我想为现有表创建一个非空列。有三个步骤:
- 如果在此步骤之前运行"python manage.py makemigrations posts",则仍然会得到"您正在尝试添加不可为空的字段"。
小精灵
对于实际的应用程序,您需要像其他人指出的那样提供一个默认值。
在我的
这样可以解决一些用户问题。
好吧,所以我所做的并不是去搞移民。好像我每次都会因为移民而陷入麻烦。在这种情况下,尝试重放迁移让我一无所获。也许没有帮助,有一些南部年份的移民以及更新的1.7东西。
环境:Postgres 9.3
基本上,我将数据库的一个旧备份还原到一个空数据库中。然后,我在postgres管理实用程序中提出了恢复目标,并从每个表的描述中复制/粘贴了创建表(我只剩下4个)。切换到我的测试数据库,并在pg的sql实用程序中运行它。
我不知道,如果你有问题的话,我认为手动删除一个表是不合理的(在我看来,如果我的ID字段的序列不起作用),只要你能忍受丢失数据。在那个用例中,迁移应该是有弹性的。