【问题标题】:Django + postgres relation does not exist errorDjango + postgres 关系不存在错误
【发布时间】:2016-07-05 09:38:14
【问题描述】:

我知道有多少关于这件事的问题,但建议的解决方案都没有帮助。 我遇到了以下问题: 我删除了我的模型并删除了admin.py 中的导入。然后我想用makemigrations 更新django 数据库,这表明它删除了模型员工,但是在使用migrate 命令之后,我看到了一个关系不存在的错误。我还从我使用的 postgres 数据库中删除了它。 这里奇怪的是, migrate 一直在寻找不存在的模型。即使我创建另一个makemigrations 检测到它然后migraterelation project_employee.. 试过syncdb --all没有成功。这是migrate的输出

Apply all migrations: sessions, project, admin, auth, contenttypes
Running migrations:
Applying project.0003_auto_20160318_1215...Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
psycopg2.ProgrammingError: relation "project_employee" does not exist


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
 File "manage.py", line 10, in <module>
  execute_from_command_line(sys.argv)
File "/usr/lib/python3/dist-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
utility.execute()
File "/usr/lib/python3/dist-packages/django/core/management/__init__.py", line 377, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/lib/python3/dist-packages/django/core/management/base.py", line 288, in run_from_argv
self.execute(*args, **options.__dict__)
File "/usr/lib/python3/dist-packages/django/core/management/base.py", line 338, in execute
output = self.handle(*args, **options)
File "/usr/lib/python3/dist-packages/django/core/management/commands/migrate.py", line 161, in handle
executor.migrate(targets, plan, fake=options.get("fake", False))
File "/usr/lib/python3/dist-packages/django/db/migrations/executor.py", line 68, in migrate
self.apply_migration(migration, fake=fake)
File "/usr/lib/python3/dist-packages/django/db/migrations/executor.py", line 102, in apply_migration
migration.apply(project_state, schema_editor)
File "/usr/lib/python3/dist-packages/django/db/migrations/migration.py", line 108, in apply
operation.database_forwards(self.app_label, schema_editor, project_state, new_state)
 File "/usr/lib/python3/dist-packages/django/db/migrations/operations/fields.py", line 84, in database_forwards
schema_editor.remove_field(from_model, from_model._meta.get_field_by_name(self.name)[0])
 File "/usr/lib/python3/dist-packages/django/db/backends/schema.py", line 431, in remove_field
self.execute(sql)
 File "/usr/lib/python3/dist-packages/django/db/backends/schema.py", line 111, in execute
cursor.execute(sql, params)
 File "/usr/lib/python3/dist-packages/django/db/backends/utils.py", line 81, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
 File "/usr/lib/python3/dist-packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
 File "/usr/lib/python3/dist-packages/django/db/utils.py", line 94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
 File "/usr/lib/python3/dist-packages/django/utils/six.py", line 658, in reraise
raise value.with_traceback(tb)
 File "/usr/lib/python3/dist-packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
 django.db.utils.ProgrammingError: relation "project_employee" does not exist

`

谢谢

【问题讨论】:

    标签: python django postgresql


    【解决方案1】:

    我为我做的是使用下面的命令来伪造迁移

    python3 manage.py migrate yourapp --fake
    

    【讨论】:

      【解决方案2】:

      最后,它对我有用。我必须删除所有表,然后删除迁移文件。

      然后手动尝试以下命令

      python manage.py makemigrations [appname]
      
      python manage.py migrate [appname]
      

      【讨论】:

      • 这与this other answer 中的解决方案相同。 在回答已有答案的旧问题时,请确保提供新颖的解决方案或比现有答案更好的解释。
      【解决方案3】:

      最后这对我有用:

      python manage.py makemigrations [app_name]
      
      python manage.py migrate [app_name]
      

      【讨论】:

      • 这只是通用的迁移代码,并没有试图解决这个问题。
      【解决方案4】:

      我可以通过以下步骤解决这个问题

      1. 当我运行这个命令时

        python manage.py migrate app_name zero

        它抱怨缺少某些表。所以我创建了一个带有虚拟列的虚拟表。

      2. 我已经再次运行命令

        python manage.py migrate app_name zero

      3. 我已经为该应用应用了迁移

        python manage.py migrate app_name

      【讨论】:

        【解决方案5】:

        使用以下代码删除数据库中的表

        python manage.py migrate app_name zero
        

        然后再次迁移

        python manage.py migrate app_name
        

        原因是已经存在一个表,当你进行“初始迁移”时,Django 将看到初始迁移已经应用,因为该表已经存在于旧模式中,因此不采用新模式考虑到具有不同架构的表。

        【讨论】:

          【解决方案6】:

          最终的帮助是从项目文件夹中删除整个迁移文件夹。也看到了一些南方的回应,但还没有尝试过。

          【讨论】:

            【解决方案7】:

            我需要做的就是创建一个具有相同名称和一个虚拟列的表。然后当我迁移时,django 为我重新制作了所有列。

            【讨论】:

              【解决方案8】:

              AFAIK,您不应该在迁移之前直接从数据库中删除表。如果你改变你的模型,那么manage.py migrate 会做这件事。

              django 无法检测到 DB 的直接变化;只知道模型脚本的变化。因此,如果你删除了一个表,那么 django 不会检测到更改,因此 django 会继续寻找被删除的表并给出错误。

              有时迁移会无缘无故地不起作用。在这种情况下,我会做以下事情:

              1. 撤消models.py的更改
              2. 执行 django 迁移(manage.py makemigrations appnamemanage.py makemigrations 效果更好)
              3. 如果迁移成功,则再次更改 models.py
              4. 再次执行 django 迁移

              这有时有效。

              【讨论】:

              • 好吧,我从来没有在不先删除模型的情况下删除表。我删除的唯一表是那些模型被删除的表。无论如何删除整个迁移文件夹解决了它。有人建议 --fake ,但它没有帮助。还是谢谢!
              • 我试过这个并没有解决我的问题。我也尝试过挤压和伪装,但没有任何效果。有什么想法吗?
              猜你喜欢
              • 2019-08-02
              • 2020-04-09
              • 2022-03-29
              • 2016-04-11
              • 2021-04-14
              • 1970-01-01
              • 2015-06-22
              • 2014-11-07
              • 2013-12-21
              相关资源
              最近更新 更多