Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django 1.7迁移赢得';为什么不重新创建一张掉落的桌子?_Python_Django_Django 1.7 - Fatal编程技术网

Python Django 1.7迁移赢得';为什么不重新创建一张掉落的桌子?

Python Django 1.7迁移赢得';为什么不重新创建一张掉落的桌子?,python,django,django-1.7,Python,Django,Django 1.7,使用Django 1.7迁移 我不小心在数据库中掉了一个表。我假设通过再次运行迁移,这将重新创建表,但Django声明“没有要应用的迁移” 如何让Django重新创建表格 我参加过: > makemigrations - No changes detected > migrate - No migrations to apply. 我尝试过对模型进行更改并运行新的迁移,它只是简单地声明“表'x.test_customer'不存在”,这是正确的,但我希望它能够重新创建表。迁移检查模型

使用Django 1.7迁移

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

如何让Django重新创建表格

我参加过:

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

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

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

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

from django.db import migrations, models

class Migration(migrations.Migration):

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

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

我实际上找到了一种更简单的方法。您假装回滚不存在的内容,然后重新迁移。如果您的迁移0005是创建表的迁移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

在那之后应该很好

好的,所以我所做的就是不要把迁移搞得一团糟。似乎我经常因为迁移而遇到麻烦。在这种情况下,尝试重播迁移对我毫无帮助。可能没有帮助,因为有一些南部老式迁移以及更新的1.7的东西

环境:博士后9.3

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

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

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

您是否尝试过通过表
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 |
+----+-----------------------+----------------------------------------------------------+---------------------+
所以现在如果我想删除
主页
,我可以删除第30、31、32行

当然,由于您也删除了这些表,因此还需要更改
django\u content\u类型

+----+----------------------------------------+-----------------------+--------------------------------------+
| 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\u migrations
。删除所有
app
等于你的app name的行


然后执行
makemigrations
&
migrate
将起作用。

我找到的另一个解决方案非常有效:

在django 1.7中:

  • 删除您的迁移文件夹

  • 在数据库中:
    从django_迁移中删除,其中app='app_name'

    您也可以直接截断此表

  • python manage.py makemigrations

  • python manage.py迁移--false

  • 在django 1.9.5中:

  • 删除您的迁移文件夹

  • 在数据库中:
    从django_迁移中删除,其中app='app_name'

    您也可以直接截断此表

  • python manage.py makemigrations应用程序\u name

  • python manage.py迁移


  • 这对我来说100%有效

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

    ./manage.py migrate app_name zero
    

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

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

  • 删除所需应用程序中的迁移文件
  • 感谢raul的回答:在数据库中:
    从django\u迁移中删除,其中app='app\u name'
  • 注释
    models.py中的代码,所有这些模型在
    视图
    信号
    等中使用(以防止错误)
  • python manage.py makemigrations您的应用程序名称
  • python manage.py迁移--false
  • 取消对您在步骤3中所评论内容的评论
  • python manage.py makemigrations您的应用程序名称
  • 迁移而不使用--false
    python manage.py migrate

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

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

  • 放下桌子
  • 删除django_迁移中的记录
  • 删除相关表的迁移
    • 如果在此步骤之前运行“python manage.py makemigrations posts”,您仍然会得到“您正在尝试添加一个不可为空的字段”
  • 对于实际应用,您需要提供def
    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