2009-03-29 10 views
95

मैं एक साधारण डेटाबेस क्वेरी करने के लिए निम्नलिखित PHP स्क्रिप्ट को चलाने के लिए कोशिश कर रहा हूँ:बस PostgreSQL तालिका नाम ("संबंध मौजूद नहीं है") का उपयोग नहीं कर सकते हैं

:

$db_host = "localhost"; 
$db_name = "showfinder"; 
$username = "user"; 
$password = "password"; 
$dbconn = pg_connect("host=$db_host dbname=$db_name user=$username password=$password") 
    or die('Could not connect: ' . pg_last_error()); 

$query = 'SELECT * FROM sf_bands LIMIT 10'; 
$result = pg_query($query) or die('Query failed: ' . pg_last_error()); 

यह निम्न त्रुटि पैदा करता है

Query failed: ERROR: relation "sf_bands" does not exist

सभी उदाहरणों में मुझे पता चल सकता है कि किसी को संबंध बताते हुए कोई त्रुटि क्यों मिलती है, ऐसा इसलिए है क्योंकि वे अपने टेबल नाम में अपरकेस अक्षरों का उपयोग करते हैं। मेरे टेबल नाम में अपरकेस अक्षर नहीं हैं। डेटाबेस नाम सहित, बिना किसी संदेश के पूछने का कोई तरीका है, यानी showfinder.sf_bands?

+2

क्या आप सुनिश्चित हैं कि sf_bands तालिका मौजूद है? क्या showfinder.sf_bands काम करता है? –

+1

showfinder.sf_bands पूरी तरह से काम करता है – Keyslinger

+0

शायद मुझे ध्यान रखना चाहिए कि मेरा डेटाबेस MySQL – Keyslinger

उत्तर

189

जो मैंने पढ़ा है, उससे यह त्रुटि का अर्थ है कि आप तालिका के नाम का सही संदर्भ नहीं दे रहे हैं। एक आम कारण यह है कि तालिका मिश्रित-केस वर्तनी के साथ परिभाषित की जाती है, और आप इसे सभी लोअर-केस के साथ पूछने की कोशिश कर रहे हैं।

दूसरे शब्दों में, निम्नलिखित में विफल रहता है:

CREATE TABLE "SF_Bands" (...); 

SELECT * FROM sf_bands; -- ERROR! 

उपयोग डबल उद्धरण पहचानकर्ता परिसीमित करने के लिए है, इसलिए आप मिश्रित-केस वर्तनी के रूप में परिभाषित किया गया है तालिका का उपयोग कर सकते हैं।

SELECT * FROM "SF_Bands"; 

अपनी टिप्पणी पुन, आप तो यह है कि जब आप अपने स्कीमा योग्यता के बिना एक मेज नाम का संदर्भ, क्वेरी क्रम में प्रत्येक स्कीमा जाँच से उस तालिका नाम से मिलान होगा "search_path" करने के लिए एक स्कीमा में जोड़ सकते हैं ।

SET search_path TO showfinder,public; 

भी देखें http://www.postgresql.org/docs/8.3/static/ddl-schemas.html

+0

ओह, मुझे माफ़ कर दो। मेरा कहना था कि मेरे टेबल नाम में कोई अपरकेस अक्षर नहीं है, न कि मेरा डेटाबेस नाम। – Keyslinger

+9

ऐसा प्रतीत होता है कि भले ही आप 'SELECT * से SF_Bands' टाइप करें, फिर भी यह असफल हो जाएगा, क्योंकि पोस्टग्रेस आपके लिए उस तालिका का नाम कम करने का निर्णय लेता है। अजीब ... –

+3

@romkyns: हां, यह वास्तव में आरडीबीएमएस ब्रांडों में काफी आम है, कि कम से कम पहचानकर्ताओं को "केस-असंवेदनशील" के रूप में विज्ञापित किया जाता है। लेकिन वे वास्तव में असंवेदनशील नहीं हैं क्योंकि जिस तरह से उन्होंने इसे लागू किया है वह लोअरकेस को मजबूर करना है। यह तालिका के नाम से मेल खाता है यदि आपने तालिका को परिभाषित करते समय टेबल नाम को कम करने की अनुमति दी थी। यदि आप तालिका बनाते समय डबल-कोट डिलीमीटर का उपयोग करते हैं, तो आपको क्वेरी में संदर्भित करते समय आपको डिलीमीटर का उपयोग करना होगा। –

9
:

SHOW search_path 
    "$user",public 

आप अपने स्कीमा खोज पथ बदल सकते हैं: बस खोल में PATH या PHP में include_path की तरह, आदि आप अपने वर्तमान स्कीमा खोज पथ की जांच कर सकते

अपनी कनेक्शन स्ट्रिंग में dbname पैरामीटर डालें। यह मेरे लिए काम करता है जबकि बाकी सब कुछ विफल रहा है।

इसके अलावा, चयन करते समय, your_schema निर्दिष्ट करें। your_table इस तरह:

select * from my_schema.your_table 
+0

स्कीमा नाम डालकर, उदा। क्वेरी में my_schema.my_relation मदद की। – JoeTidee

+0

बहुत बहुत धन्यवाद! यह समस्या हल करने में मेरी मदद करता है! लेकिन क्या कोई तरीका है कि मैं योजना का नाम छोड़ सकता हूं? – Charlotte

9

पोस्टग्रेस प्रक्रिया क्वेरी अन्य आरडीएमएस से अलग है। स्कीमा नाम को अपने टेबल नाम से पहले दोहरा उद्धरण में रखें, "SCHEMA_NAME"।"SF_Bands"

+4

आपका उत्तर पूर्व स्वीकृत उत्तर में 22 बार और अधिक विवरण के साथ क्या जोड़ता है? – Yaroslav

41

मैं इस के साथ समस्या नहीं थी और इस कहानी (दुख की बात है, लेकिन सच है) है: अपने तालिका नाम की तरह सभी छोटे अक्षर है

  1. हैं: खातों आप का उपयोग कर सकते हैं: select * from AcCounTs और कहीं भी होगी काम ठीक

  2. अपने तालिका नाम की तरह सभी निचले मामला है, तो: accounts निम्नलिखित असफल हो जायेगी: select * from "AcCounTs"

  3. अपनी मेज नाम है, तो मिश्रित केस की तरह: Accounts निम्नलिखित असफल हो जायेगी: select * from accounts

  4. अपनी मेज नाम मिश्रित केस की तरह है: select * from "Accounts"

: Accounts निम्नलिखित ठीक काम करेंगे

मुझे इस तरह बेकार सामान याद रखना पसंद नहीं है, लेकिन आपको करना है;)

+0

कॉलम नामों के लिए वही है जहां क्लॉज – Roland

+5

5. मिश्रित मामला, जैसे 'लेखा', खातों से 'चयन * के साथ असफल हो जाएगा;' मुझे अजीब हिस्सा मिल रहा है: समान मामला समान नहीं है। – Roland

+1

इसमें सब कुछ है: पोस्टग्रेस क्वेरी में सभी नाम लोअरकेस हैं, जब तक कि आप उद्धरण का उपयोग न करें। – Erndob

2

मुझे ओएसएक्स पर एक ही समस्या थी लेकिन एरो खेलने की कोशिश की डबल और सिंगल कोट्स के साथ अंडे। आपके मामले के लिए, आप इस

$query = 'SELECT * FROM "sf_bands"'; NOTE: double quotes on "sf_Bands" 
0

की तरह कुछ की कोशिश कर सकते मेरे लिए समस्या थी, कि मुझे लगता है कि विशेष रूप से मेज पर एक प्रश्न का इस्तेमाल किया था, जबकि Django प्रारंभ किया गया था। बेशक यह एक त्रुटि फेंक देगा, क्योंकि उन टेबल मौजूद नहीं थे। मेरे मामले में, यह एक admin.py फ़ाइल में get_or_create विधि थी, जिसे सॉफ़्टवेयर किसी भी तरह का ऑपरेशन चलाता था (इस मामले में माइग्रेशन)। उम्मीद है कि किसी की मदद करता है।

संबंधित मुद्दे