Postgresql टेबल मौजूद है, लेकिन क्वेरी करते समय "संबंध मौजूद नहीं है"


87

मेरे पास कई टेबल के साथ एक पोस्टग्रैस्कल डीबी है। अगर मैं प्रश्न:

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

मैं कॉलम क्यों प्राप्त कर सकता हूं, इस पर कोई विचार, लेकिन तालिका को क्वेरी नहीं कर सकता? लक्ष्य तालिका को क्वेरी करने में सक्षम होना है।


क्या आप अन्य तालिका के साथ भी ऐसा कर सकते हैं? एक नया बनाने का प्रयास करें।
जुआन कार्लोस ओरोपेज़ा

2
आपके द्वारा दिखाई गई क्वेरी काम नहीं कर सकती है। WHERE table_name="my_table";अमान्य है क्योंकि "my_table"स्तंभ नाम का संदर्भ है और इस तरह का कोई स्तंभ नहीं है information_schema.columns। कृपया अपना प्रश्न संपादित करें और तालिका बनाने के लिए आपके द्वारा उपयोग किए गए सटीक create table विवरण को जोड़ें ।
a_horse_with_no_name

जवाबों:


97

यदि स्कीमा सार्वजनिक नहीं है तो आपको स्कीमा को शामिल करना होगा

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

3
सही उत्तर। यदि क्लस्टर> कैटलॉग> स्कीमा> टेबल के एसक्यूएल मानक पदानुक्रम से परिचित नहीं है, तो प्रश्न देखें, एक रिलेशनल डेटाबेस में कैटलॉग और स्कीमा के बीच अंतर क्या है? और मेरा आरेख
तुलसी बॉर्क

हाँ - यह किया, बहुत धन्यवाद। बेशक अब मुझे मिल रहा है permission denied, लेकिन कम से कम मुझे पता है कि मुझे कहां जाना है।
patkil

5
इस सूत्र के भविष्य के पाठकों के लिए, यह त्रुटि भी हो सकती है, जैसे कि यह मेरे मामले में हुआ, जब स्कीमा नाम और तालिका नाम में मिश्रित वर्ण अक्षर हैं और व्यक्तिगत रूप से दोहरे उद्धरण चिह्नों में संलग्न नहीं हैं। दूसरे शब्दों में उन्हें इस प्रकार निर्दिष्ट करना होगा: "my_Schema"। "my_Table"
Snidhi Sofpro

1
@SnidhiSofpro वैसे तो क्षेत्र के नामों के साथ भी होता है, मेरा सुझाव सिर्फ निचले मामलों के नामों का उपयोग करना है ताकि आपको दोहरे उद्धरण चिह्नों को जोड़ना न पड़े।
जुआन कार्लोस ओरोपीजा

1
क्या होगा अगर सब कुछ SET search_path TO my_schema;पोस्टग्रेज शेल में काम करता है लेकिन सटीक चीज़ अजगर कोड में काम नहीं करेगा? मेरे पास कोई मामला संवेदनशील समस्या नहीं है। मुझे यकीन है!
एलेक्स जोलीग

24

तुम कोशिश कर सकते हो:

SELECT * 
FROM public."my_table"

My_table के पास दोहरे उद्धरण मत भूलना।


3
तालिका के नाम में दोहरे उद्धरण जोड़कर मेरे लिए काम किया। धन्यवाद।
अक्षय

12

मुझे तालिका के नाम के साथ दोहरे उद्धरण शामिल करने थे।

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 है। इस डंप के क्रिएट टेबल स्टेटमेंट में दोहरे उद्धरण चिह्नों के साथ था:

DROP TABLE IF EXISTS "COMMONDATA_NWCG_AGENCIES";

CREATE TABLE "COMMONDATA_NWCG_AGENCIES" (
...

4
डिफ़ॉल्ट रूप से पोस्टग्रेट्स सब कुछ को कम करने के लिए परिवर्तित करता है जब तक कि दोहरे उद्धरण चिह्नों का उपयोग न किया जाए।
अर्पित सिंह

3

मेरे पास वही समस्या थी जो मैंने पोस्टग्रेटेड डब से डेटा को पुनर्स्थापित करने के बाद हुई थी।

मेरे डंप फ़ाइल में नीचे की कमांड थी जहां से चीजें दक्षिण की ओर जाने लगीं।

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

समाधान:

  1. शायद यह हटाने या बदलने कि falseहोने के लिए true
  2. एक निजी स्कीमा बनाएं, जिसका उपयोग सभी तालिकाओं तक पहुंचने के लिए किया जाएगा।

ऊपर दिया गया कमांड केवल सभी सार्वजनिक रूप से सुलभ स्कीमा को निष्क्रिय कर देता है।

यहां प्रलेखन पर अधिक देखें : https://www.postgresql.org/docs/9.3/ecpg-connect.html



0

मैं अपनी तालिकाएँ बनाने के लिए 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 पर परीक्षण किया गया


0

मेरे मामले में, मैंने जिस डंप फ़ाइल को पुनर्स्थापित किया था, उसमें ये कमांड थे।

CREATE SCHEMA employees;
SET search_path = employees, pg_catalog;

मैंने उन पर टिप्पणी की है और फिर से बहाल किया है। मसला हल हो गया


0

मैंने इस त्रुटि को मारा और यह पता चला कि मेरा कनेक्शन स्ट्रिंग किसी अन्य डेटाबेस की ओर इशारा कर रहा था, जाहिर है कि तालिका वहां मौजूद नहीं थी।

मैंने इस पर कुछ घंटे बिताए और किसी और ने आपके कनेक्शन स्ट्रिंग की दोहरी जांच करने का उल्लेख नहीं किया ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.