Postgreql 表存在,但在查询时获取“关系不存在”

我有一个包含许多表的 postgreql db:

SELECT column_name
FROM information_schema.columns
WHERE table_name="my_table";

我将获得正确返回的列的列表。

但是,当我问:

SELECT *
FROM "my_table";

我得到了一个错误:

(ProgrammingError) relation "my_table" does not exist
'SELECT *\n    FROM "my_table"\n' {}

关于为什么我可以获取列,但不能查询表,有什么想法吗?目标是能够查询表。

349104 次浏览

如果模式不是公共模式,则必须包含该模式

SELECT *
FROM <schema>."my_table"

或者可以更改默认模式

SHOW search_path;
SET search_path TO my_schema;

在这里检查表模式

SELECT *
FROM information_schema.columns

enter image description here

例如,如果一个表位于默认模式 public上,那么这两者都可以正常工作

SELECT * FROM parroquias_region
SELECT * FROM public.parroquias_region

但是扇区需要指定模式

SELECT * FROM map_update.sectores_point

你可以试试:

SELECT *
FROM public."my_table"

不要忘记在 my _ table 附近使用双引号。

在我从 Postgres 转储的 db 中恢复数据之后,也出现了同样的问题。

我的转储文件包含下面的命令,从而开始出现问题。

    SELECT pg_catalog.set_config('search_path', '', false);

解决方案:

  1. 可能移除它或改变 falsetrue
  2. 创建用于访问所有表的私有架构。

上面的命令只是停用所有公共可访问的架构。

在这里查看更多的文档: https://www.postgresql.org/docs/9.3/ecpg-connect.html

我必须在表名中包含双引号。

db=> \d
List of relations
Schema |                     Name                      | Type  | Owner
--------+-----------------------------------------------+-------+-------
public | COMMONDATA_NWCG_AGENCIES                      | table | dan
...


db=> \d COMMONDATA_NWCG_AGENCIES
Did not find any relation named "COMMONDATA_NWCG_AGENCIES".

???

双引号:

db=> \d "COMMONDATA_NWCG_AGENCIES"
Table "public.COMMONDATA_NWCG_AGENCIES"
Column          |            Type             | Collation | Nullable | Default
--------------------------+-----------------------------+-----------+----------+---------
ID                       | integer                     |           | not null |
...

很多很多的双引号:

db=> select ID from COMMONDATA_NWCG_AGENCIES limit 1;
ERROR:  relation "commondata_nwcg_agencies" does not exist
LINE 1: select ID from COMMONDATA_NWCG_AGENCIES limit 1;
^
db=> select ID from "COMMONDATA_NWCG_AGENCIES" limit 1;
ERROR:  column "id" does not exist
LINE 1: select ID from "COMMONDATA_NWCG_AGENCIES" limit 1;
^
db=> select "ID" from "COMMONDATA_NWCG_AGENCIES" limit 1;
ID
----
1
(1 row)

这是 postgres 11。来自这个转储的 CREATE TABLE 语句也有双引号:

DROP TABLE IF EXISTS "COMMONDATA_NWCG_AGENCIES";


CREATE TABLE "COMMONDATA_NWCG_AGENCIES" (
...

该错误可能是由访问限制引起的。解决方案:

GRANT ALL PRIVILEGES ON DATABASE my_database TO my_user;

我使用 pgAdmin 来创建表,虽然我没有使用保留字,但是生成的表在名称中有一个引号,有几列中有引号。下面是生成的 SQL 的一个示例。

CREATE TABLE public."Test"
(
id serial NOT NULL,
data text NOT NULL,
updater character varying(50) NOT NULL,
"updateDt" time with time zone NOT NULL,
CONSTRAINT test_pk PRIMARY KEY (id)
)


TABLESPACE pg_default;


ALTER TABLE public."Test"
OWNER to svc_newnews_app;

所有这些引号都是“随机”插入的。我只需要删除并重新创建没有引号的表。

在 pgAdmin 4.26上测试

在我的例子中,我还原的转储文件具有以下命令。

CREATE SCHEMA employees;
SET search_path = employees, pg_catalog;

我已经注释了这些,并再次恢复。问题得到了解决

我出现了这个错误,结果是我的连接字符串指向了另一个数据库,显然这个表不存在。

我花了几个小时在这上面,没有人向 再次检查您的连接字符串提过。

假设我们的数据库名称为 students,模式名称为 studentinformation,那么为了使用这个模式的所有表,我们需要先设置路径,我们可以在 postgresql中这样做:

client.connect()
.then(()=>console.log("connected succesfully"))
.then(()=>client.query("set search_path to students"))
.then(()=>client.query("show search_path"))
.then(()=>client.query("set search_path to studentinformation"))
.then(()=>client.query("show search_path"))
.then(results => console.table(results.rows)) //setting the search path

将所有表名都保持小写,因为当您回滚然后转到 best 时,它显然正在查找小写。

请确保:

  1. 您的密码不是空的
  2. 如果为空,则不要在连接字符串中传递 password参数

在开始学习本教程时,这是最常见的错误之一。