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

Posted

技术标签:

【中文标题】Postgres:当公共模式上存在表时,关系不存在错误【英文标题】:Postgres: relation does not exist error when table exists on public schema 【发布时间】:2019-04-23 02:17:14 【问题描述】:

我有一张使用 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

您知道这里可能导致错误的原因吗?

【问题讨论】:

您是否以表所有者postgres 的身份登录? (顺便说一句:使用超级用户创建表或为您的应用程序使用超级用户帐户不是一个好主意) 是的,我以postgres 用户身份登录。感谢您的提示,我只在我的开发机器上执行此操作,而在生产中我使用的是不同的用户 我可以知道为什么在这里标记熊猫吗? 该表是使用 pandas 的 to_sql 方法创建的,pandas 可以使用 read_sql 方法很好地读取它,所以我认为它可能与它有关。我现在删除标签 【参考方案1】:

您的表名包含双引号。

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

所以表是这样创建的:

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

选择时需要使用相同的语法:

SELECT * 
FROM """e7b6a2e19789418e9e48fd34e981b036""";

【讨论】:

非常感谢,这有效。起初我怀疑,但尝试做 SELECT * FROM "\"e7b6a2e19789418e9e48fd34e981b036\"" 一直抛出语法错误

以上是关于Postgres:当公共模式上存在表时,关系不存在错误的主要内容,如果未能解决你的问题,请参考以下文章

Postgres INNER JOIN ERROR:模式“bar”不存在

Postgres 数据库:关系不存在

Spring Boot 和 Postgres:关系“sub_comment”不存在

Spring Batch / Postgres:错误:关系“batch_job_instance”不存在

postgres不断给出“模式不存在”错误[重复]

PostgreSQL JDBC - 使用 PreparedStatements 创建表时已存在关系