【问题标题】:Relation does not exist error in Django after postgresql integrationpostgresql 集成后 Django 中的关系不存在错误
【发布时间】:2021-07-30 11:40:20
【问题描述】:

我在开发过程中使用了 sqlite3,然后将我的数据库设置更改为 postgresql:

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'test2',
    'USER': 'postgres',
    'PASSWORD': 'aman',
    'HOST': 'localhost',
    'PORT': '5432',
    }
}

不管我写什么命令,它都会给我错误:

django.db.utils.ProgrammingError: relation "taksist_category" does not exist
LINE 1: ...st_category"."id", "taksist_category"."name" FROM "taksist_c...

类别模型存在于 taksist 应用程序中。如果我将我的数据库设置恢复到 sqlite3,那么应用程序将成功运行。

我什至无法运行我的服务器。即使我的模型 taksist/Category 有问题,我的应用程序也应该运行。这里奇怪的是无论写什么命令,我都会收到这个错误。我无法进行 makemigrations、migrate、runserver。

我做了什么来解决这个问题:

  • 已删除迁移文件夹,并尝试 makemigrations
  • 我创建了带有 init.py 的空迁移文件夹,并且 尝试 makemigrations
  • python manage.py migrate --fake

以上都不起作用。

这里是 taksist.category 模型,以防万一。

class Category(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length = 20)

    def __str__(self):
        return self.name

感谢您的任何帮助。提前谢谢你。

【问题讨论】:

  • 检查了我的型号名称,它在任何地方都是正确的,检查 INSTALLED_APPS,有我的应用程序名称。正如我所说,如果我将数据库设置更改为 sqlite3,那么一切正常。我可以注册新用户,并从数据库中获取信息。但是在切换到 postgreql 之后就会发生这个错误。如果我的代码中有错字,那么它也不应该与 sqlite3 一起使用,但它可以与 sqlite3 一起使用
  • 你跑了吗python manage.py migrate
  • 无论我执行什么命令,我都会收到此错误。甚至 runserver、makemigrations 和 migrate。将数据库设置更改为 postgresql 后,我无法迁移。我什么都做不了。

标签: python django postgresql


【解决方案1】:

“关系不存在”的根本原因是尚未运行迁移。

但是,通过 cmets:

无论我执行什么命令,我都会收到此错误。甚至 runserver、makemigrations 和 migrate。将数据库设置更改为 postgresql 后,我无法迁移。我什么都做不了。

这可能意味着您编写的应用程序在初始化期间访问数据库的方式,例如像

from my_app.models import Blog

default_blog = Blog.objects.get(pk=1)

def view(...):

这意味着 Django 将在导入该模块后立即尝试访问数据库。如果在 Django 尝试为 migrate 初始化自身时导入了该模块,则会出现异常。

您可以查看您的 django.db.utils.ProgrammingError 的回溯,以找出有问题的访问权限并修复它。例如,get_default_blog() 之类的函数会更好地服务于上述模式。

如果我将数据库设置恢复到 sqlite3,那么应用程序将成功运行。

此错误还意味着,如果您重命名或删除当前工作的 SQLite 数据库,您也无法获得新的数据库,因为尝试 migrate 会失败并出现类似错误。这不仅仅是 Postgres 的“错误”。

【讨论】:

  • 哇,谢谢你的帮助。令人难以置信的解决问题的方法。当我创建taxiprofile 模型时,我使用category_choice = [(x.id, x.name) for x in Category.objects.all()]。所以正如你所说,它试图从不存在的表中获取,因为第一次迁移尚未完成。所以我将代码修改为:category_choice = []。现在它工作了:)
  • 听起来该字段应该是类别的ForeignKey,但很高兴我能在任何情况下提供帮助!
  • 已经是ForeignKey,像这样:class TaxiProfile(models.Model): category_choice = [(x.id, x.name) for x in Category.objects.all()] category = models .ForeignKey(Category,on_delete = models.SET_NULL,null = True,choices=category_choice,blank=True)
  • 那你根本不需要设置选项:)
  • 我的图像选择列表为空,只是为了成功进行第一次迁移。迁移后,我收回了 category_choice = [(x.id, x.name) for x in Category.objects.all()]。迁移后它工作正常,再次感谢你:)
【解决方案2】:

如果是测试数据库,请执行 py manage.py flush 命令,然后再次运行py manage.py makemigrations ,然后运行py manage.py migrate 命令。

应该可以解决。

【讨论】:

  • 运行刷新后出现同样的错误:django.db.utils.ProgrammingError: 关系“taksist_category”不存在 LINE 1: ...st_category"."id", "taksist_category"."name" FROM “taksist_c ... ^
  • 您是什么时候收到此错误的,在 makemigrations 期间或在 migrate 期间
  • makemigrations,迁移,运行服务器。全部。正如AKX所说,这不是postgresql错误。这是逻辑错误。那是在我的代码中,我查询了尚不存在的模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
相关资源
最近更新 更多