Postgres数据库错误:关系不存在

4
我正在修复一个遗留系统的问题,遇到了一些问题,我很惊讶这些问题没有更早被发现。在运行此应用程序时,我使用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 字段,以便用户可以拥有多个问题,并且一个问题可以被多个用户使用。


设置 search_pathschema_where_is_your_object 对你有帮助吗? - Luc M
2个回答

4
很可能的原因是

关系“password_user_answered_questions_id_s”不存在

正如错误信息所提示的那样。您知道PostgreSQL如何处理标识符吗?

此外,序列通常命名为*_seq。末尾缺少字母了吗?


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

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

加粗强调是我的。看起来您应该稍微缩短标识符。


它是自动生成的,所以我假设 *_seq 由于某种原因丢失了,但我真的不明白为什么会被截断。我必须将实际字段缩小到这里,因为我不想使用实际名称,但长度是否有限制? - CF711
@CF711:可能就是这样了。我在我的回答中添加了一点内容。 - Erwin Brandstetter
3
如果您在数据库中使用一个可以为一个字符使用多个字节的字符编码,那么有一个细微的点需要注意——限制是63个字节,而你可能只用了远少于63个字符。Erwin确实正确地陈述了这个限制,但有时人们只计算字符数,不理解问题所在,所以我觉得值得提一下。 - kgrittn

0
问题可能是您的数据库没有同步。请执行以下命令:
  1. python manage.py makemigrations myappname
  2. python manage.py migrate myappname

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接