【问题标题】:Postgres Database Error: relation does not existPostgres 数据库错误:关系不存在
【发布时间】:2012-04-27 16:51:21
【问题描述】:

我正在修复遗留系统的一些问题,但遇到了一个令我惊讶的是没有尽早发现的问题。我正在运行 Django 1.3 并在运行此应用程序时使用 postgres 9.1.3。该系统是一个验证系统,供用户使用系统的其余部分。它使用 Django 用户界面的一部分,但大多数情况下它都有自己的“用户”。

当我尝试向用户提出他们的帐户问题时,我的问题就出现了(类似于如果您忘记了网站密码)。当我尝试这样做时,它会引发此错误:

Database Error at admin/password/user

relation "password_user_answered_questions_id_s" does not exist
LINE 1: SELECT CURRVAL('"password_user_quest...
              ^

有谁知道可能导致此错误的原因?我尝试过重置数据库(不认为它会做任何事情,只是想确定一下),并且还使用 phppgadmin 在数据库中四处寻找,发现除了这个之外,其他所有内容都正确存储。它在分配时使用了 ManyToMany 字段,以便用户可以有多个问题,并且一个问题可以被多个用户使用。

【问题讨论】:

  • set search_path TO schema_where_is_your_object 对您有帮助吗?

标签: database django postgresql system legacy


【解决方案1】:

原因很可能是

关系“password_user_answered_questions_id_s”不存在

就像错误信息告诉我们的一样。你知道PostgreSQL handles identifiers是怎么回事吗?

此外,序列通常命名为 *_seq。结尾的字母不见了?


关于标识符的最大长度 - 我从上面的链接中引用手册:

系统使用不超过 NAMEDATALEN-1 个字节的标识符; 较长的名称可以写在命令中,但它们会被截断。 默认情况下,NAMEDATALEN 为 64,因此最大标识符长度为 63 字节。如果此限制有问题,可以通过更改 src/include/pg_config_manual.h 中的 NAMEDATALEN 常量。

我的大胆强调。看来您应该稍微缩短标识符。

【讨论】:

  • 它会自动生成它,所以我假设 *_seq 由于某种原因丢失了,但我真的不明白为什么它被切断了。我不得不剪掉这里的实际字段,因为我不想使用它的实际名称,但是长度有限制吗?
  • @CF711:大概就是这样。我在答案中添加了一些内容。
  • 如果您为数据库使用的字符编码可以为一个字符使用多个字节 - 限制为 63 个字节,那么您应该注意一个微妙的点,你可以用少得多的字符来击中它。欧文当然正确地说明了限制,但有时人们只是计算字符而不知道问题出在哪里,所以我认为值得一提。
【解决方案2】:

问题是你还没有同步你的数据库,我猜。请执行以下命令:

  1. python manage.py makemigrations myappname
  2. python manage.py migrate myappname

【讨论】:

    猜你喜欢
    • 2021-01-13
    • 2016-07-05
    • 2022-03-29
    • 2015-06-11
    • 2020-10-25
    • 2021-04-14
    • 2013-07-11
    • 2012-08-27
    • 2016-03-23
    相关资源
    最近更新 更多