Các bảng postgresql tồn tại, nhưng nhận được "quan hệ không tồn tại" khi truy vấn


83

Tôi có một db postgresql với một số bảng. Nếu tôi truy vấn:

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

Tôi sẽ nhận được danh sách các cột được trả về đúng cách.

Tuy nhiên, khi tôi truy vấn:

SELECT *
FROM "my_table";

Tôi gặp lỗi:

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

Bất kỳ suy nghĩ nào về lý do tại sao tôi có thể nhận được các cột, nhưng không thể truy vấn bảng? Mục tiêu là có thể truy vấn bảng.


bạn có thể làm tương tự với một bảng khác? thử tạo một cái mới.
Juan Carlos Oropeza,

2
Truy vấn bạn đã hiển thị không thể hoạt động. WHERE table_name="my_table";không hợp lệ vì "my_table"tham chiếu đến tên cột và không có cột như vậy trong information_schema.columns. Vui lòng chỉnh sửa câu hỏi của bạn và thêm câu lệnh chính xác create table mà bạn đã sử dụng để tạo bảng.
a_horse_with_no_name

Câu trả lời:


93

Bạn phải bao gồm lược đồ nếu không phải là lược đồ công khai

SELECT *
FROM <schema>."my_table"

Hoặc bạn có thể thay đổi giản đồ mặc định của mình

SHOW search_path;
SET search_path TO my_schema;

Kiểm tra lược đồ bảng của bạn tại đây

SELECT *
FROM information_schema.columns

nhập mô tả hình ảnh ở đây

Ví dụ: nếu một bảng nằm trên lược đồ mặc định, publiccả hai điều này sẽ hoạt động tốt

SELECT * FROM parroquias_region
SELECT * FROM public.parroquias_region

Nhưng các ngành cần chỉ định lược đồ

SELECT * FROM map_update.sectores_point

2
Câu trả lời chính xác. Nếu không quen thuộc với cấu trúc phân cấp Cluster> Catalog> Schema> Table của chuẩn SQL, hãy xem Câu hỏi, Sự khác biệt giữa danh mục và lược đồ trong cơ sở dữ liệu quan hệ là gì? sơ đồ của tôi .
Basil Bourque vào

Yup - điều này đã làm được, cảm ơn rất nhiều. Tất nhiên bây giờ tôi đang nhận được permission denied, nhưng điều đó ít nhất tôi biết phải đi đến đâu.
patkil

4
Đối với những người đọc trong tương lai của chuỗi này, lỗi này cũng có thể xảy ra, giống như trong trường hợp của tôi, khi tên lược đồ & tên bảng có các ký tự viết hoa hỗn hợp & không được đặt riêng trong dấu ngoặc kép. Nói cách khác họ đã được xác định như sau: "my_Schema" "my_Table"
Snidhi Sofpro

1
@SnidhiSofpro Điều đó cũng xảy ra với tên trường, Đề xuất của tôi chỉ sử dụng tên chữ thường để bạn không phải thêm vào các dấu ngoặc kép rắc rối.
Juan Carlos Oropeza,

1
Điều gì sẽ xảy ra nếu mọi thứ hoạt động với trình SET search_path TO my_schema;bao postgres nhưng điều chính xác sẽ không hoạt động trong mã python? Tôi không có bất kỳ vấn đề phân biệt chữ hoa chữ thường. Tôi chắc chắn!
Alex Jolig

22

Bạn co thể thử:

SELECT * 
FROM public."my_table"

Đừng quên dấu ngoặc kép gần my_table.


3
Thêm dấu ngoặc kép vào tên bảng đã làm việc cho tôi. Cảm ơn.
iAkshay

10

Tôi đã phải bao gồm dấu ngoặc kép với tên bảng.

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

???

Dấu ngoặc kép:

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

Rất nhiều và rất nhiều dấu ngoặc kép:

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)

Đây là postgres 11. Các câu lệnh CREATE TABLE từ kết xuất này cũng có dấu ngoặc kép:

DROP TABLE IF EXISTS "COMMONDATA_NWCG_AGENCIES";

CREATE TABLE "COMMONDATA_NWCG_AGENCIES" (
...

4
Postgres theo mặc định chuyển đổi mọi thứ thành chữ thường trừ khi tất nhiên là sử dụng dấu ngoặc kép.
Arpit Singh

3

Tôi đã gặp sự cố tương tự xảy ra sau khi tôi khôi phục dữ liệu từ một db bị kết xuất postgres.

Tệp kết xuất của tôi có lệnh bên dưới từ nơi mọi thứ bắt đầu đi xuống phía nam.

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

Các giải pháp:

  1. Có lẽ loại bỏ nó hoặc thay đổi điều đó falseđược true.
  2. Tạo một lược đồ riêng tư sẽ được sử dụng để truy cập tất cả các bảng.

Lệnh trên chỉ đơn giản là hủy kích hoạt tất cả các lược đồ có thể truy cập công khai.

Kiểm tra thêm tài liệu tại đây: https://www.postgresql.org/docs/9.3/ecpg-connect.html


1

Lỗi có thể do hạn chế truy cập. Giải pháp:

GRANT ALL PRIVILEGES ON DATABASE my_database TO my_user;

0

Tôi đang sử dụng pgAdmin để tạo các bảng của mình và trong khi tôi không sử dụng các từ dành riêng, bảng được tạo có một trích dẫn trong tên và một vài cột có dấu ngoặc kép trong đó. Đây là một ví dụ về SQL được tạo.

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;

Tất cả các trích dẫn này đã được chèn một cách "ngẫu nhiên". Tôi chỉ cần thả và tạo lại bảng một lần nữa mà không cần dấu ngoặc kép.

Đã thử nghiệm trên pgAdmin 4.26


0

Trong trường hợp của tôi, tệp kết xuất mà tôi đã khôi phục có các lệnh này.

CREATE SCHEMA employees;
SET search_path = employees, pg_catalog;

Tôi đã nhận xét những điều đó và khôi phục lại. Sự cố đã được giải quyết


0

Tôi gặp lỗi này và hóa ra chuỗi kết nối của tôi đang trỏ đến một cơ sở dữ liệu khác, rõ ràng là bảng không tồn tại ở đó.

Tôi đã dành vài giờ cho việc này và không ai khác đã đề cập để kiểm tra lại chuỗi kết nối của bạn .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.