Postgresql tabloları var, ancak sorgulama sırasında "ilişki yok" alınıyor


88

Birkaç tablo içeren bir postgresql db var. Sorgularsam:

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

Doğru şekilde döndürülen sütunların bir listesini alacağım.

Ancak, sorguladığımda:

SELECT *
FROM "my_table";

Şu hatayı alıyorum:

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

Neden sütunları alabildiğime, ancak tabloyu sorgulayamadığıma dair bir fikriniz var mı? Amaç, tabloyu sorgulayabilmektir.


aynısını başka bir masa ile yapabilir misin? yeni bir tane oluşturmayı deneyin.
Juan Carlos Oropeza

2
Gösterdiğiniz sorgu çalışamaz. WHERE table_name="my_table";geçersiz çünkü "my_table"bir sütun adına başvuruyor ve içinde böyle bir sütun yok information_schema.columns. Lütfen sorunuzu düzenleyin ve tabloyu oluşturmak için kullandığınız ifadeyi tam olarak ekleyin create table.
a_horse_with_no_name

Yanıtlar:


97

Herkese açık bir şema değilse, şemayı dahil etmelisiniz

SELECT *
FROM <schema>."my_table"

Veya varsayılan şemanızı değiştirebilirsiniz

SHOW search_path;
SET search_path TO my_schema;

Tablo şemanızı buradan kontrol edin

SELECT *
FROM information_schema.columns

görüntü açıklamasını buraya girin

Örneğin, bir tablo varsayılan şema üzerindeyse publicher ikisi de işe yarar

SELECT * FROM parroquias_region
SELECT * FROM public.parroquias_region

Ancak sektörlerin şemayı belirtmesi gerekir

SELECT * FROM map_update.sectores_point

3
Doğru cevap. SQL standardının Küme> Katalog> Şema> Tablo hiyerarşisine aşina değilseniz, Soru, İlişkisel bir veritabanında katalog ile şema arasındaki fark nedir? ve benim diyagramım .
Basil Bourque

Evet - bu yaptı, çok teşekkürler. Elbette şimdi anlıyorum permission denied, ama en azından nereye gideceğimi biliyorum.
patkil

5
Bu iş parçacığının gelecekteki okuyucuları için, bu hata, benim durumumda olduğu gibi, Şema adı ve Tablo adı karışık büyük / küçük harf karakterlerine sahip olduğunda ve tek tek çift tırnak içine alınmadığında da ortaya çıkabilir. Diğer bir deyişle, şu şekilde belirtilmeleri gerekir: "my_Schema". "My_Table"
Snidhi Sofpro

1
@SnidhiSofpro Bu aynı zamanda alan adlarında da olur, Benim önerim sadece küçük harfli isimler kullanın, böylece çift tırnak zahmetini eklemenize gerek kalmaz.
Juan Carlos Oropeza

1
Ya her şey SET search_path TO my_schema;postgres kabuğunda çalışırsa, ancak tam olarak python kodunda çalışmazsa? Büyük / küçük harfe duyarlı sorunum yok. Eminim!
Alex Jolig

24

Deneyebilirsin:

SELECT * 
FROM public."my_table"

My_table'ın yanındaki çift tırnak işaretlerini unutmayın.


3
Tablo adına çift tırnak eklemek benim için çalıştı. Teşekkürler.
iAkshay

12

Tablo adına çift tırnak eklemem gerekiyordu.

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

???

İkili alıntı:

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

Çok sayıda çift tırnak:

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)

Bu postgres 11. Bu dökümdeki CREATE TABLE deyimlerinde de çift tırnak vardı:

DROP TABLE IF EXISTS "COMMONDATA_NWCG_AGENCIES";

CREATE TABLE "COMMONDATA_NWCG_AGENCIES" (
...

4
Postgres, elbette çift tırnak kullanılmadıkça her şeyi varsayılan olarak küçük harfe dönüştürür.
Arpit Singh

3

Postgres dökümü yapılmış bir veritabanından verileri geri yükledikten sonra meydana gelen aynı sorunu yaşadım.

Döküm dosyamda, işlerin güneye gitmeye başladığı yerden aşağıdaki komut vardı.

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

Çözümler:

  1. Muhtemelen kaldırmak veya değiştirmek falseolmak true.
  2. Tüm tablolara erişmek için kullanılacak özel bir şema oluşturun.

Yukarıdaki komut, genel olarak erişilebilen tüm şemaları devre dışı bırakır.

Buradaki belgelerde daha fazlasını kontrol edin: https://www.postgresql.org/docs/9.3/ecpg-connect.html


2

Hata, erişim kısıtlamalarından kaynaklanabilir. Çözüm:

GRANT ALL PRIVILEGES ON DATABASE my_database TO my_user;

0

Tablolarımı oluşturmak için pgAdmin kullanıyordum ve ayrılmış sözcükler kullanmıyordum, oluşturulan tablonun adında bir alıntı vardı ve birkaç sütunda tırnak vardı. İşte oluşturulan SQL'in bir örneği.

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üm bu alıntılar "rastgele" olarak eklenmiştir. Tabloyu alıntılar olmadan bırakıp yeniden oluşturmam gerekiyordu.

PgAdmin 4.26'da test edildi


0

Benim durumumda, geri yüklediğim döküm dosyası bu komutlara sahipti.

CREATE SCHEMA employees;
SET search_path = employees, pg_catalog;

Bunları yorumladım ve tekrar restore ettim. Sorun çözüldü


0

Bu hataya çarptım ve bağlantı dizemin başka bir veritabanına işaret ettiği ortaya çıktı, açıkçası tablo orada yoktu.

Bunun için birkaç saat geçirdim ve hiç kimse bağlantı dizenizi tekrar kontrol etmekten bahsetmedi .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.