django.db.utils.ProgrammingError:关系不存在

问题描述 投票:0回答:3

我使用 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
django postgresql django-models django-migrations
3个回答
4
投票

添加更改/添加新模型后,请始终确保运行

python manage.py makemigrations
python manage.py migrate
。 如果由于任何原因(迁移树重新安排、数据库故障等)出现问题,您可以通过执行
python manage.py migrate {app_name} {migration_index}
恢复到特定迁移。 因此,针对您的情况,我建议您尝试
python manage.py migrate {app_name} zero
,然后重新迁移回最新版本。 您可能还需要使用
--fake


0
投票

这是一个可能的解决方法:删除旧的迁移。注释掉所有模型中与

Document
模型相关的所有字段,并执行
makemigrations
migrate
单独创建“文档”表。取消其他模型中
Document
相关字段的注释并重新进行迁移。


0
投票

我遇到了(看似)同样的问题。 无法运行迁移或其他任何操作...

我的情况的原因是:

我有 2 个数据库(带有一个 DB 路由器)。在 Database2 的一个模型中,我使用了 CHOICES 生成函数,该函数使用 Database1 的 model-X 中的数据。我在创建 Database-1.Model-X 之后编写了该函数。

当我现在尝试在没有新 Database-1.Model-X 的生产系统上部署新迁移时,我得到了相同的错误。

我看到了3种可能性:

  • 在应用迁移之前注释掉访问不存在模型的函数(不知何故蹩脚且容易出错)
  • 将选择生成从模型移至表单(没有更改任何内容)
  • 更改/扩展数据库路由器以允许数据库之间的外键关系,使用与 DataBase1 的 ForeinKey 关系,同时在外键定义中选择所需(唯一)字段为 to_field="XYZ",因此 Database2 字段的内容为填充正确的数据。 <- This 'works for me'™

也许这对有相同或类似问题的人来说是一个启发。

问候

卡尔

© www.soinside.com 2019 - 2024. All rights reserved.