programing

postgresql 테이블이 있지만 쿼리할 때 "관계가 존재하지 않습니다"를 가져옵니다.

minimums 2023. 5. 3. 20:53
반응형

postgresql 테이블이 있지만 쿼리할 때 "관계가 존재하지 않습니다"를 가져옵니다.

나는 많은 테이블이 있는 postgresql 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' {}

왜 제가 칼럼을 받을 수 있는데 표를 조회할 수 없는지에 대한 의견이 있으십니까?목표는 테이블을 쿼리할 수 있는 것입니다.

공용 스키마가 아닌 경우 스키마를 포함해야 합니다.

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"

내_테이블 근처에 있는 큰따옴표를 잊지 마세요.

저는 테이블 이름에 큰따옴표를 포함해야 했습니다.

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)

여기는 11번 우편물입니다.이 덤프의 CREATE TABLE 문에도 큰따옴표가 있습니다.

DROP TABLE IF EXISTS "COMMONDATA_NWCG_AGENCIES";

CREATE TABLE "COMMONDATA_NWCG_AGENCIES" (
...

이 오류가 발생하면 연결 문자열이 다른 데이터베이스를 가리키고 있는 것으로 드러났습니다. 분명히 테이블이 없습니다.

몇 시간 동안 이 작업을 했는데 아무도 연결 문자열을 다시 확인하라고 하지 않았습니다.

postgres dumped db에서 데이터를 복원한 후에도 동일한 문제가 발생했습니다.

내 덤프 파일은 아래 명령어를 가지고 있었습니다. 상황이 악화되기 시작한 곳부터요.

    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;

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에서 테스트됨

다음 사항을 확인하십시오.

  1. 암호가 비어 있지 않습니다.
  2. 비어 있는 경우 다음을 통과하지 마십시오.password연결 문자열의 매개 변수

튜토리얼을 시작할 때 가장 일반적인 오류 중 하나입니다.

제 경우, 제가 복원한 덤프 파일에는 다음과 같은 명령이 있었습니다.

CREATE SCHEMA employees;
SET search_path = employees, pg_catalog;

주석을 달았다가 다시 복원했습니다.문제가 해결되었습니다.

모든 테이블 이름은 소문자로 유지합니다. 롤백한 다음 최신 상태로 이동하면 소문자를 찾는 것 같습니다.

데이터베이스 이름을 다음과 같이 지정합니다.students을 " " "로 지정합니다.studentinformation이의 모든 ▁path▁we▁the▁then▁do▁in▁of▁which▁we합다▁table니▁to▁need▁the▁can▁schema▁to▁this▁set▁all▁use그설런정해에서 할 수 있는 경로를 설정해야 합니다.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 

저는 Postgre의 psql을 사용하고 있었습니다.SQL, 그리고 어떻게든 저는 먼저 데이터베이스에 연결하여 그곳에 테이블을 만드는 대신 "postgres=#" 디렉토리에 테이블을 만들었습니다.

표를 작성하기 전에 원하는 데이터베이스에 연결했는지 확인하십시오.

언급URL : https://stackoverflow.com/questions/36753568/postgresql-tables-exists-but-getting-relation-does-not-exist-when-querying

반응형