簡體   English   中英

Postgresql表存在,查詢時提示“關系不存在”

[英]Postgresql tables exists, but getting "relation does not exist" when querying

我有一個帶有許多表的 postgresql 數據庫。 如果我查詢:

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' {}

關於為什么我可以獲得列但不能查詢表的任何想法? 目標是能夠查詢表。

如果不是公共架構,則必須包含架構

SELECT *
FROM <schema>."my_table"

或者您可以更改默認架構

SHOW search_path;
SET search_path TO my_schema;

在此處檢查您的表架構

SELECT *
FROM information_schema.columns

在此處輸入圖片說明

例如,如果一個表在默認模式public ,這都可以正常工作

SELECT * FROM parroquias_region
SELECT * FROM public.parroquias_region

但部門需要指定架構

SELECT * FROM map_update.sectores_point

你可以試試:

SELECT * 
FROM public."my_table"

不要忘記 my_table 附近的雙引號。

我必須在表名中包含雙引號。

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" (
...

我遇到了這個錯誤,結果我的連接字符串指向另一個數據庫,顯然那里不存在該表。

我在這上面花了幾個小時,沒有人提到要仔細檢查您的連接字符串

從 postgres 轉儲的數據庫恢復數據后,我遇到了同樣的問題。

我的轉儲文件有下面的命令,從那里開始向南。

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

解決方案:

  1. 可能將其刪除或將false更改為true
  2. 創建將用於訪問所有表的私有模式。

上面的命令只是停用所有可公開訪問的模式。

在此處查看文檔的更多信息: https : //www.postgresql.org/docs/9.3/ecpg-connect.html

該錯誤可能是由訪問限制引起的。 解決方法:

GRANT ALL PRIVILEGES ON DATABASE my_database TO my_user;

請確保:

  1. 您的密碼非空
  2. 如果為空,請不要在連接字符串中傳遞password參數

這是開始學習本教程時最常見的錯誤之一。

我正在使用 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 

將所有表名保持為小寫,因為當您回滾然后轉到最新時,它顯然在尋找小寫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM