Postgres:当公共模式上存在表时,关系不存在错误

时间:2018-11-20 15:30:58

标签: postgresql quoted-identifier

我有一个使用Pandas转储到Postgres的表,而Pandas可以使用read_sql_table命令很好地读取它,但是我似乎无法使用SQL来访问它。运行\dt命令时,将公共模式下列出的表作为现有表之一。

                 List of relations
 Schema |                Name                | Type  |  Owner   
--------+------------------------------------+-------+----------
 public | "e7b6a2e19789418e9e48fd34e981b036" | table | postgres

但是当我运行SELECT * FROM "e7b6a2e19789418e9e48fd34e981b036";时,得到的关系不存在错误。我尝试了以下方法:

  • SELECT * FROM "e7b6a2e19789418e9e48fd34e981b036"
  • SELECT * FROM "public"."e7b6a2e19789418e9e48fd34e981b036"
  • 通过执行GRANT USAGE ON SCHEMA public TO postgres;
  • 允许用户使用公共架构
  • 检查了此stack overflow answer,表明它可能是标识符长度太长,但我的标识符长度是32个字节,而Postgres默认允许最多63个字节

当我运行SHOW search_path;时,它显示"$user", public应该是正确的,但是出于某种原因,Postgres一直说该关系不存在。

其他有用的信息:

  • 我正在here的docker容器中运行Postgres

关于可能导致此错误的原因有什么想法?

1 个答案:

答案 0 :(得分:3)

您的表名包含双引号。

在标识符中嵌入双引号遵循与在字符串文字中嵌入单引号相同的规则:您需要将它们双引:

因此,该表的创建是这样的:

create table """e7b6a2e19789418e9e48fd34e981b036"""(...);

从中选择时,您需要使用相同的语法:

SELECT * 
FROM """e7b6a2e19789418e9e48fd34e981b036""";