表被删除了,我怎样才能让Django重新创建呢?

Его*_*дев 14 python django postgresql django-models django-migrations

有两个模型组和学生,只有一个表的组,学生表被删除.

如何maje Django再次创建它?如果我做了数字,它会打印"未检测到任何变化".

在管理页面上,当我单击Students表时,它会抛出异常:

relation "students_students" does not exist
Run Code Online (Sandbox Code Playgroud)

Raú*_* EL 39

在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
Run Code Online (Sandbox Code Playgroud)

如果您在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
Run Code Online (Sandbox Code Playgroud)

这对我来说100%有效!

  • 对我来说,关键只是在`makemigrations`关键字后添加<app_name>。我正在使用Django 1.10(SEP 2016) (2认同)
  • 为了确保它有效,您必须在其中添加更多步骤。2.1 从数据库中删除所有表。否则,在进行迁移时您会收到诸如 xyz 表存在之类的错误。 (2认同)

Ala*_*air 9

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

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

./manage.py sqlmigrate students 00XX_create_students
Run Code Online (Sandbox Code Playgroud)

如果学生表中有外键,请注意,也必须创建约束.

  • 正确,虽然在这种情况下他可能需要运行`sqlmigrate` (2认同)

Air*_*ker 9

对我有用的唯一方法:

rm -r <app-name>/migrations/
python manage.py makemigrations <app-name>
python manage.py sqlmigrate <app-name> 0001_initial
Run Code Online (Sandbox Code Playgroud)

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

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

psql -U user_name -h 127.0.0.1 database_name
Run Code Online (Sandbox Code Playgroud)

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

提交查询。

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


Bru*_*len 5

对我有用的答案如下:

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

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

  • run: python manage.py makemigrations <app-name>,其中<app-name>是包含 models.py 的应用程序的名称

  • 跑步:python manage.py migrate --fake <app-name>

  • 取消注释 models.py 中的模型

  • 跑步:python manage.py makemigrations <app-name>

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

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


Ben*_*ari 5

2021 年 1 月

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

python manage.py migrate --fake app_name zero 
python manage.py migrate app_name
Run Code Online (Sandbox Code Playgroud)

[笔记]

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

阅读更多