我使用 Postgres db 开发了一个部署在 DigitalOcean 的 Ubuntu 服务器上的 Django 应用程序。一切工作正常,没有任何问题,但今天添加新模型后,我收到此错误:
relation "documents_app_document" does not exist
虽然我有这个模型,但我的一些模型继承自Document
模型。但不知何故它已从数据库中删除,现在我无法在迁移后将其添加回数据库。如何将该模型作为表再次添加到数据库中?
p.s:但是我打开了名为“0001_initial.py”的迁移文件,有
migrations.CreateModel( name='Document'...
models.py
:
class Document(models.Model):
created_date = models.DateTimeField(default=timezone.now, blank=True, null=True)
added_by = CurrentUserField()
purpose = models.CharField(blank=True, max_length=300, null=True)
def __str__(self):
return str(self.added_by)
class MedicalDocument(Document):
policy_number = models.CharField(max_length=20, blank=True, null=True)
medical_institution = models.CharField(max_length=100, blank=True, null=True)
迁移错误:
Operations to perform:
Unapply all migrations: documents_app
Running migrations:
Rendering model states... DONE
Unapplying documents_app.0001_initial...Traceback (most recent call last):
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedTable: relation "documents_app_document" does not exist
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 22, in <module>
main()
File "manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/core/management/__init__.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/core/management/base.py", line 323, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/core/management/base.py", line 364, in execute
output = self.handle(*args, **options)
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/core/management/base.py", line 83, in wrapped
res = handle_func(*args, **kwargs)
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/core/management/commands/migrate.py", line 234, in handle
fake_initial=fake_initial,
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/db/migrations/executor.py", line 121, in migrate
state = self._migrate_all_backwards(plan, full_plan, fake=fake)
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/db/migrations/executor.py", line 196, in _migrate_all_backwards
self.unapply_migration(states[migration], migration, fake=fake)
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/db/migrations/executor.py", line 269, in unapply_migration
state = migration.unapply(state, schema_editor)
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/db/migrations/migration.py", line 175, in unapply
operation.database_backwards(self.app_label, schema_editor, from_state, to_state)
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/db/migrations/operations/fields.py", line 120, in database_backwards
schema_editor.remove_field(from_model, from_model._meta.get_field(self.name))
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/db/backends/base/schema.py", line 487, in remove_field
self.execute(sql)
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/db/backends/base/schema.py", line 137, in execute
cursor.execute(sql, params)
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/db/backends/utils.py", line 99, in execute
return super().execute(sql, params)
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/db/backends/utils.py", line 67, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/db/utils.py", line 89, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/home/azersigorta/insuranceproject/env/lib/python3.5/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "documents_app_document" does not exist
添加更改/添加新模型后,请始终确保运行
python manage.py makemigrations
和 python manage.py migrate
。
如果由于任何原因(迁移树重新安排、数据库故障等)出现问题,您可以通过执行 python manage.py migrate {app_name} {migration_index}
恢复到特定迁移。
因此,针对您的情况,我建议您尝试 python manage.py migrate {app_name} zero
,然后重新迁移回最新版本。
您可能还需要使用 --fake
。
这是一个可能的解决方法:删除旧的迁移。注释掉所有模型中与
Document
模型相关的所有字段,并执行 makemigrations
和 migrate
单独创建“文档”表。取消其他模型中Document
相关字段的注释并重新进行迁移。
我遇到了(看似)同样的问题。 无法运行迁移或其他任何操作...
我的情况的原因是:
我有 2 个数据库(带有一个 DB 路由器)。在 Database2 的一个模型中,我使用了 CHOICES 生成函数,该函数使用 Database1 的 model-X 中的数据。我在创建 Database-1.Model-X 之后编写了该函数。
当我现在尝试在没有新 Database-1.Model-X 的生产系统上部署新迁移时,我得到了相同的错误。
我看到了3种可能性:
也许这对有相同或类似问题的人来说是一个启发。
问候
卡尔