如何使用 Django Migrations 重新创建已删除的表?

Posted

技术标签:

【中文标题】如何使用 Django Migrations 重新创建已删除的表?【英文标题】:How to recreate a deleted table with Django Migrations? 【发布时间】:2016-01-20 11:02:21 【问题描述】:

有两个模型Groups和Students,其中Groups只有一个表,Students表被删除了。

如何让 Django 重新创建已删除的表?如果我这样做 makemigrations 它会打印“未检测到更改”。

在管理页面上,当我单击学生表时,它会引发异常:

relation "students_students" does not exist

【问题讨论】:

你试过syncdb吗? 是的,它会抛出错误:students_groups 已经存在,但没有关于 students_students 的信息 为什么要让 Django 创建它?如果数据库模式是手动更改的,那么它也应该手动恢复。答案是 SQL。 它是一种变通方法,对学生模型进行小的更改并使用 makemigrations 为学生更改生成新的迁移文件,然后运行迁移命令。它应该创建学生表。 【参考方案1】:

2021 年 1 月

我遇到了迁移问题,我不得不通过 pgadmin 删除/删除一个表。然后,当我 makemigrationsmigrate 没有重新创建表时。通过这种方式,我发现这个程序对我有用:

python manage.py migrate --fake app_name zero 
python manage.py migrate app_name

[注意]

如果您没有预期的迁移文件,请在python manage.py makemigrations 的上述命令之前创建该文件 如果您不想回滚到初始(零)状态,请使用迁移文件的编号而不是 zero,例如python manage.py migrate --fake myappname 0005 我在 Django 2.2 中测试了这种方法

Read More

【讨论】:

这对我有用。谢谢!简直不敢相信这不是更明确。 这是唯一对我有用的方法;值得更多点赞!非常感谢 小心,这可能会尝试在应用程序中重新创建其他模型,尽管它们已经在数据库中。【参考方案2】:

实际上,上述方法对我不起作用,所以我只执行以下解决方法,因为我不想手动编写整个查询来创建表。

所以我更改了设置文件中的数据库并在删除迁移文件夹后重新运行迁移命令,然后执行 python 迁移命令它在另一个数据库中创建了新表,然后从那里在查询视图中打开表,复制脚本,并将表插入到我的主数据库中。

【讨论】:

【参考方案3】:

如果您已经创建了类并执行了迁移操作,然后您想将项目添加到您的类中,请事先使用此命令清空迁移文件夹。 在 Django 3 中,我按照以下步骤进行操作,它工作 100%

    python manage.py makemigrations appname --empty python manage.py makemigrations appname python manage.py migrate

【讨论】:

【参考方案4】:

Django 3.1.3

直接在postgresql中删除一个数据库表后——应用中的一个相关表。

The solution from Airstriker 为我工作。 谢谢!

【讨论】:

【参考方案5】:

从您的迁移应用文件夹中删除迁移文件夹,然后运行迁移命令:

    python3 manage.py makemigrations appname python3 manage.py migrate

【讨论】:

【参考方案6】:

对我有用的唯一方法:

rm -r <app-name>/migrations/
python manage.py makemigrations <app-name>
python manage.py sqlmigrate <app-name> 0001_initial

复制它打印出来的内容(或者,根据您实际从数据库中删除的内容,只复制部分 SQL 查询)。

将这些复制的查询应用到您的数据库:

psql -U user_name -h 127.0.0.1 database_name

粘贴您从 SQL 查询打印输出中复制的内容。

提交查询。

就是这样 - 您的缺失表已创建。

【讨论】:

您先生,刚刚为我节省了很多痛苦和我的数据库。自从我以 postgres 连接以来,只有最后一步,我不得不更改所有者,但没什么大不了的,无论如何谢谢!【参考方案7】:

对我有用的答案如下:

假设您的数据库中的模型表已被删除,您需要重新创建,然后执行以下操作。

在 models.py 中注释掉创建已删除表的模型(模型类或创建类似 a = models.ManyToManyField(...) 的表的行)

运行:python manage.py makemigrations &lt;app-name&gt;,其中 &lt;app-name&gt; 是您拥有 models.py 的应用的名称

运行:python manage.py migrate --fake &lt;app-name&gt;

在 models.py 中取消注释模型

运行:python manage.py makemigrations &lt;app-name&gt;

运行:python manage.py migrate &lt;app-name&gt;(没有 --fake)

你的表应该回到数据库中。但是表中的所有数据都将丢失。

【讨论】:

【参考方案8】:

在models.py中将删除的表名重命名为some_new_name并运行:

python3 manage.py makemigrationpython3 manage.py migrate

再次将 some_new_name 表重命名为原始名称并运行

python3 manage.py makemigrationpython3 manage.py migrate

最后,转到 dbshel​​l 并删除表 some_new_name

【讨论】:

【参考方案9】:

没有一种简单的方法可以让 Django 重新创建您手动删除的表。一旦您的数据库被手动更改,Django 的数据库视图(来自迁移)就与现实不同,修复起来可能会很棘手。

如果您运行sqlmigrate 命令,它将显示创建表所需的 SQL。您可以在数据库外壳中运行 sql。假设您的应用名称是 students,并且创建表的迁移是 00XX_create_students.py,您会这样做:

./manage.py sqlmigrate students 00XX_create_students

如果学生表有外键或来自学生表的外键,请注意,也必须创建约束。

【讨论】:

正确,虽然在这种情况下他可能需要运行 sqlmigrate 来代替 with sqlall prints CommandError: App students hasmigrations. Only the sqlmigrate and sqlflush can be used, with sqlmigrate 有requared迁移名称,我能找到吗? @gbs 好点,我已将答案改为使用 sqlmigrate 您需要搜索 students/migrations 目录以找到创建模型的迁移。搜索型号名称Student。如果有任何更改表的后续迁移(例如添加或删除字段),请小心,因为您还必须从这些迁移中运行适当的 SQL。 这是关于该主题的最佳提示。 (在最新的 Django 2.0 上测试)【参考方案10】:

我刚刚删除了我的迁移文件夹,删除了整个数据库,然后我为应用程序进行了迁移

python3 manage.py makemigration 
python3 manage.py migrate

它又回来了。

【讨论】:

【参考方案11】:

Django 1.11.2 使用 MariaDB,数据库表意外丢失。 要重新创建表,请尝试以下操作: 1/ 删除 app/migrations 目录中除了 init.py 之外的所有内容 2/ 从 django_migrations 中选择 *;从 django_migrations 中删除 app = 'yourapp'; 3/ 检查您的模型是否良好并运行:python manage.py makemigrations 4/ python manage.py 迁移

为我工作!

【讨论】:

【参考方案12】:

对于 Django 1.10.4 我从项目文件夹中删除了 db.sqlite3 文件,然后运行以下命令:

    python manage.py makemigrations app_name python manage.py 迁移

【讨论】:

【参考方案13】:

在 django 1.7 中你可以尝试:

1. Delete your migrations folder

2. In the database: DELETE FROM django_migrations WHERE app = 'app_name'.
   You could alternatively just truncate this table.

3. python manage.py makemigrations

4. python manage.py migrate --fake

如果您使用 django 1.9.5,这是解决此问题的 100% 解决方案:

1. Delete your migrations folder

2. In the database: DELETE FROM django_migrations WHERE app = 'app_name'.
   You could alternatively just truncate this table.

3. python manage.py makemigrations app_name

4. python manage.py migrate

这对我来说 100% 有效!

【讨论】:

对我来说,关键是在 makemigrations 关键字之后添加 。我正在使用 Django 1.10(2016 年 9 月) 我得到一个异常“django.db.migrations.exceptions.NodeNotFoundError” 如果有人想知道如何在步骤 2 中进入数据库,请使用以下命令:python manage.py dbshell 为了确保它有效,您必须在其中添加更多步骤。 2.1 从数据库中删除所有表。否则你会在迁移时收到诸如 xyz table 存在之类的错误。 是的,它说 OperationalError 表已经存在【参考方案14】:

我手动创建表格,这很有帮助。

【讨论】:

这不是问题所要求的

以上是关于如何使用 Django Migrations 重新创建已删除的表?的主要内容,如果未能解决你的问题,请参考以下文章

Django 删除 migrations

django.db.migrations.exceptions.MigrationSchemaMissing和raise ImproperlyConfigured('mysqlclient 1

替换django的user模型出现的异常django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.00

python测试开发django-72.删除表后如何重新生成表

django数据库的表已迁移的不能重新迁移的解决办法

django manage.py model 删除表后怎么重新生成数据库表