如何使用 Django 迁移重新创建已删除的 table?

How to recreate a deleted table with Django Migrations?

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

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

在管理页面上,当我点击学生时 table 它抛出异常:

relation "students_students" does not exist

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

如果您 运行 使用 sqlmigrate 命令,它将显示创建 table 所需的 SQL。您可以 运行 数据库 shell 中的 sql。假设您的应用程序名称是 students,并且创建 table 的迁移是 00XX_create_students.py,您将执行:

./manage.py sqlmigrate students 00XX_create_students

如果存在进出学生的外键,请小心 table,也必须创建约束。

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

在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% 有效!

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

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

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

适合我!

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

python3 manage.py makemigration 
python3 manage.py migrate

它又回来了。

在models.py和运行中将删除的table名称重命名为some_new_name:

python3 manage.py makemigration
python3 manage.py migrate

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

python3 manage.py makemigration
python3 manage.py migrate

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

对我有用的答案如下:

假设在您的数据库中删除了一个 table 模型,您需要重新创建,然后执行以下操作。

  • 注释掉 models.py 中创建已删除的 table 的模型(模型 class 或创建 table喜欢a = models.ManyToManyField(...))

  • 运行:python manage.py makemigrations <app-name>,其中 <app-name> 是您拥有 models.py

    [= 的应用程序的名称41=]
  • 运行: python manage.py migrate --fake <app-name>

  • 取消注释 models.py

  • 中的模型
  • 运行: python manage.py makemigrations <app-name>

  • 运行:python manage.py migrate <app-name>(没有 --fake)

你 table 应该回到数据库中。但是 table 中的任何数据都将丢失。

唯一对我有用的方法:

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 查询打印输出中复制的内容。

提交查询。

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

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

  1. python3 manage.py makemigrations appname
  2. python3 manage.py migrate

Django 3.1.3

直接在 postgresql 中删除数据库后 table - 应用程序中的相关 table。

对我有用。 谢谢!

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

  1. python manage.py makemigrations appname --empty
  2. python manage.py makemigrations appname
  3. python manage.py migrate

2021 年 1 月

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

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

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

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