使用Django 1.7迁移。
我不小心在我的数据库中删除了一个表。我假设通过再次运行迁移,这将重新创建表,但不,Django说“没有迁移要应用”。
如何让Django重新创建表格?
我跑了:
> makemigrations - No changes detected
> migrate - No migrations to apply.
我尝试对模型进行更改并运行新迁移,它只是声明“Table'x.test_customer'不存在”这是正确的,但我希望它会重新创建表
答案 0 :(得分:49)
转到您的数据库并找到表django_migrations
。删除app
等于您的应用名称的所有行。
然后做一个makemigrations
& migrate
可以使用。
答案 1 :(得分:21)
我找到并完美运作的另一种解决方案:
在django 1.7:
删除迁移文件夹
在数据库中:DELETE FROM django_migrations WHERE app = 'app_name'
。
您也可以截断此表。
python manage.py makemigrations
python manage.py migrate --fake
在django 1.9.5中:
在数据库中:DELETE FROM django_migrations WHERE app = 'app_name'
。
您也可以截断此表。
python manage.py makemigrations app_name
python manage.py migrate
这对我来说是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的情况下迁移 }}
与劳尔的回答有些不同:
--fake
。DELETE FROM django_migrations WHERE app = 'app_name'
中的注释代码,以及所有这些模型在models.py
,views
等中的用法(以防止错误)。signals
python manage.py makemigrations YOUR_APP_NAME
python manage.py migrate --fake
python manage.py makemigrations YOUR_APP_NAME
这应该可以解决一些用户问题。
答案 8 :(得分:0)
在构建一个学习django的小应用程序时遇到了这个问题。我想为现有表创建一个非空列。分三个步骤:
对于实际的应用程序,您需要提供其他人指出的默认值。
答案 9 :(得分:0)
可能是最简单的方法。
例如如果您要迁移的文件是struct
,而您最新的迁移文件是app_name.002_xyz
然后,您需要复制app_name.004_abc
并将其重命名为最新的迁移文件。例如,让我们将其重命名为app_name.002_xyz
例如将此行添加到新的迁移文件中
app_name.005_xyz
例如将此行添加到新的迁移文件中
class Migration(migrations.Migration):
dependencies = [
('app_name', 'app_name.004_abc'),
]
...
例如
python manage.py migrate app_name
Running migrations:
Applying app_name.005_xyz...OK
,一切就好!