পোস্টগ্র্রেএসকিউএল টেবিলের নামটি সহজেই ব্যবহার করা যায় না ("সম্পর্ক বিদ্যমান নেই")


183

আমি একটি সাধারণ ডাটাবেস কোয়েরি করতে নিম্নলিখিত পিএইচপি স্ক্রিপ্টটি চালানোর চেষ্টা করছি:

$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());

এটি নিম্নলিখিত ত্রুটি উত্পাদন করে:

অনুসন্ধান ব্যর্থ হয়েছে: ত্রুটি: সম্পর্ক "এসএফ_ব্যান্ডস" বিদ্যমান নেই

সমস্ত উদাহরণে আমি খুঁজে পেতে পারি যে কেউ কোনও ত্রুটি পেয়েছে উল্লেখ করে যে সম্পর্কের উপস্থিতি নেই, কারণ তারা তাদের টেবিলের নামে বড় হাতের অক্ষর ব্যবহার করে। আমার টেবিলের নামটিতে বড় হাতের অক্ষর নেই। ডাটাবেসের নাম না রেখে আমার টেবিলটি জিজ্ঞাসা করার কোনও উপায় আছে, মানে showfinder.sf_bands?


2
আপনি কি নিশ্চিত যে এসএফ_ব্যান্ডস টেবিলটি বিদ্যমান? Showfinder.sf_bands কাজ করে?
ব্রায়ান-ব্রাজিল

1
showfinder.sf_bands পুরোপুরি কাজ করে
কিসলিংগার

সম্ভবত আমার নোট করা উচিত যে আমার ডাটাবেসটি মাইএসকিউএল
কিসলিংগার

আপনি কি pg_query ($ dbconn, $ কোয়েরি) চেষ্টা করতে পারেন? অন্তর্নিহিত সংযোগটি হার্ড-টু-ডিবাগ সমস্যার কারণ হতে পারে, এটি একটি সম্ভাব্য সমস্যা হিসাবে এটিও দূর করতে পারে। আপনি কী পিজি_ডবনেম ($ dbconn) চেষ্টা করে দেখতে পারেন যে এটি সত্যই শোফাইন্ডারের সাথে সংযুক্ত রয়েছে?
ব্রায়ান-ব্রাজিল

1
+1 উল্লেখ করার জন্য যে বড় অক্ষরগুলি সমস্যা। পোস্টগ্র্রেএসকিউএল-এর কোনও একক টেবিল থেকে আমি কেন নির্বাচন করতে পারি না তা জানার চেষ্টা করে আমি এক ঘন্টা ব্যয় করেছি। কি ভয়ানক প্রোগ্রাম।
Brain2000

উত্তর:


296

আমি যা পড়েছি তা থেকে, এই ত্রুটির অর্থ হল আপনি টেবিলের নামটি সঠিকভাবে উল্লেখ করছেন না। একটি সাধারণ কারণ হ'ল সারণীটি একটি মিশ্র-কেস বানান দিয়ে সংজ্ঞায়িত করা হয় এবং আপনি সমস্ত নিম্ন-কেস দিয়ে এটিকে জিজ্ঞাসা করার চেষ্টা করছেন।

অন্য কথায়, নিম্নলিখিত ব্যর্থ:

CREATE TABLE "SF_Bands" ( ... );

SELECT * FROM sf_bands;  -- ERROR!

শনাক্তকারীদের সীমানা করতে ডাবল-কোটস ব্যবহার করুন যাতে আপনি সারণীটি সংজ্ঞায়িত হওয়ায় নির্দিষ্ট মিশ্র-কেস বানানটি ব্যবহার করতে পারেন।

SELECT * FROM "SF_Bands";

আপনার মন্তব্যটি পুনরায়, আপনি "অনুসন্ধান_পাথ" -এ একটি স্কিমা যোগ করতে পারেন যাতে আপনি যখন কোনও সারণিটির স্কিমার যোগ্যতা ছাড়াই কোনও টেবিলের নাম উল্লেখ করেন, কোয়েরিটি প্রতিটি স্কিমাটি ক্রম অনুসারে পরীক্ষা করে সেই টেবিলের নামের সাথে মেলে। যেমন PATHশেল বা include_pathপিএইচপি ইত্যাদিতে আপনি নিজের বর্তমান স্কিমা অনুসন্ধানের পথটি পরীক্ষা করতে পারেন:

SHOW search_path
  "$user",public

আপনি আপনার স্কিমা অনুসন্ধানের পথটি পরিবর্তন করতে পারেন:

SET search_path TO showfinder,public;

Http://www.postgresql.org/docs/8.3/static/ddl-schemas.html আরও দেখুন


উফ, আমাকে ক্ষমা করুন। আমি বলতে চাইছিলাম যে আমার টেবিলের নামটিতে কোনও বড় অক্ষর নেই, আমার ডাটাবেসের নাম নেই not
কিসলিংগার

13
মনে হয় এটি টাইপ করা SELECT * FROM SF_Bandsসত্ত্বেও এটি ব্যর্থ হবে, কারণ পোস্টগ্রিস আপনার জন্য সেই টেবিলের নামটি ছোট করার সিদ্ধান্ত নিয়েছে। অদ্ভুত ...
রোমান স্টারকভ

3
@ ক্রমিনস: হ্যাঁ, এটি আরডিবিএমএস ব্র্যান্ডগুলিতে আসলেই প্রচলিত, এটি অনস্বীকৃত শনাক্তকারীদের "কেস-সংবেদনশীল" হিসাবে বিজ্ঞাপন দেওয়া হয়। তবে তারা সত্যিকার অর্থেই সংবেদনশীল নয় কারণ তারা যেভাবে প্রয়োগ করেছে তা হ'ল লোয়ারকেসকে বাধ্য করা। আপনি কেবল সারণিটি সংজ্ঞায়িত করার সময় টেবিলের নামটি ছোট করে রাখার অনুমতি দিলে এটি কেবল টেবিলের নামের সাথে মেলে। আপনি যখন টেবিলটি তৈরি করেন আপনি ডাবল-কোট ডিলিমিটারগুলি ব্যবহার করেন, আপনি যখন প্রশ্নগুলিতে উল্লেখ করেন তখন অবশ্যই ডিলিমিটারগুলি ব্যবহার করতে হবে।
বিল কারভিন

পোস্টগ্র্যাগগুলি টেবিলের নামগুলি উদ্ধৃতিতে না থাকলে স্বয়ংক্রিয়ভাবে ছোট হয়? এটি বেশ আনসিন ...
অ্যান্ডি

@ অ্যান্ডি, আপনি নিজের এসকিউএল ডাটাবেস লেখার সময় কেস-সংবেদনশীল শনাক্তকারীদের অন্য কোনও উপায়ে প্রয়োগ করতে দ্বিধা বোধ করবেন না। :)
বিল কারভিন

76

আমার এটি নিয়ে সমস্যা ছিল এবং এটি গল্পটি (দুঃখজনক তবে সত্য):

  1. যদি আপনার টেবিলের নামটি সমস্ত নিম্ন ক্ষেত্রে যেমন: আপনি যে অ্যাকাউন্টগুলি ব্যবহার করতে পারেন তা: select * from AcCounTsএবং এটি কার্যকর হবে

  2. যদি আপনার টেবিলের নামটি সমস্ত ছোট ক্ষেত্রে থাকে তবে: accounts নিম্নলিখিতটি ব্যর্থ হবে: select * from "AcCounTs"

  3. যদি আপনার টেবিলের নামটি মিশ্র ক্ষেত্রে হয়: Accounts নিম্নলিখিত ব্যর্থ হবে: select * from accounts

  4. যদি আপনার টেবিলের নামটি মিশ্র ক্ষেত্রে হয়: Accounts নিম্নলিখিতগুলি ঠিকঠাক কাজ করবে: select * from "Accounts"

আমি এই মতো অকেজো জিনিস মনে রাখতে চাই না তবে আপনাকে তা করতে হবে;)


1
যেখানে-ধারাগুলিতে কলামের নামগুলির জন্য একই
রোল্যান্ড

8
৫. মিশ্র ক্ষেত্রে যেমন অদ্ভুত অংশটি পাওয়া যায় তেমনি Accountsব্যর্থ হবে select * from Accounts;: একই ক্ষেত্রে একই নয় is
রোল্যান্ড

7
এটিতে রয়েছে: পোস্টগ্রিজ ক্যোয়ারিতে সমস্ত নাম ছোট হাতের অক্ষর, যদি না আপনি উদ্ধৃতি ব্যবহার করেন।
এরনডব

1
চতুর্থ বিকল্পটি আমার পক্ষে কাজ করেছে, যদিও আমি পিএইচপি ব্যবহার করছি না
সায়ারী

2
সমস্ত ইন্টারঅ্যাকশন স্থাপন করার জন্য ধন্যবাদ! :)

16

পোস্ট আরগেস প্রক্রিয়া ক্যোয়ারী অন্য আরডিএমএস থেকে আলাদা। "SCHEMA_NAME" এর মতো আপনার সারণির নামের আগে ডাবল উদ্ধৃতিতে স্কিমা নাম রাখুন "" এসএফ_ব্যান্ডস "


7
আপনার উত্তরটি পূর্বে গৃহীত উত্তরে 22 বার এবং প্রচুর বিবরণ সহ কী যুক্ত করে?
ইয়ারোস্লাভ

16

আপনার সংযোগের স্ট্রিংয়ে dbname পরামিতি রাখুন। এটি আমার পক্ষে কাজ করে যখন সমস্ত কিছু ব্যর্থ হয়।

নির্বাচনটি করার সময়, নির্দিষ্ট করুন your_schemayour_tableএটার মত:

select * from my_schema.your_table

1
স্কিমা নামটি প্রবেশ করা, উদাহরণস্বরূপ my_schema.my_relation ক্যোয়ারিতে সহায়তা করেছে।
জোটিডি

2
আপনাকে অনেক ধন্যবাদ! এটি পুনরায় আমাকে সমস্যার সমাধান করতে সহায়তা করে! তবে এমন কোনও উপায় আছে যা আমি স্কিমের নাম বাদ দিতে পারি?
শার্লট

8

ওএসএক্সে আমার একই সমস্যা ছিল তবে ডাবল এবং একক উদ্ধৃতি দিয়ে চারপাশে খেলার চেষ্টা করেছি tried আপনার ক্ষেত্রে, আপনি এই জাতীয় কিছু চেষ্টা করতে পারেন

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

4

এটি সত্যই সহায়ক

SET search_path TO schema,public;

আমি এই সমস্যাগুলি আরও খনন করেছি এবং বর্তমান ডাটাবেসে নতুন ব্যবহারকারীর জন্য ডিফল্ট দ্বারা কীভাবে এই "অনুসন্ধান_পথ" সেট করবেন সে সম্পর্কে জানতে পেরেছি।

ডেটাবেস বৈশিষ্ট্যগুলি ওপেন করুন তারপরে শীট "ভেরিয়েবলস" খুলুন এবং কেবল আসল মান সহ আপনার ব্যবহারকারীর জন্য এই পরিবর্তনশীলটি যুক্ত করুন।

সুতরাং এখন আপনার ব্যবহারকারী এই স্কিমা_নামটি ডিফল্ট দ্বারা পেয়ে যাবে এবং আপনি স্কিমা নাম বাদে টেবিলনামটি ব্যবহার করতে পারেন।


4

আপনাকে অবশ্যই স্কোমা নাম এবং সারণির নাম কোয়োটেশন চিহ্নে লিখতে হবে। নীচের হিসাবে:

select * from "schemaName"."tableName";

1

আমার জন্য সমস্যাটি ছিল, জ্যাঙ্গো সূচনা করার সময় আমি সেই নির্দিষ্ট টেবিলে একটি প্রশ্নের ব্যবহার করেছি। অবশ্যই এটি তখন ত্রুটি ছুঁড়ে ফেলবে, কারণ এই টেবিলগুলির অস্তিত্ব ছিল না। আমার ক্ষেত্রে এটি get_or_createঅ্যাডমিন.পি ফাইলের মধ্যে একটি পদ্ধতি ছিল , যখনই সফ্টওয়্যারটি কোনও ধরণের অপারেশন চালায় তখনই এটি কার্যকর করা হত (এই ক্ষেত্রে মাইগ্রেশন)। আশা করি যে কাউকে সাহায্য করবে।


0

আপনাকে প্রথমে স্কিমা যুক্ত করতে হবে যেমন

SELECT * FROM place.user_place;

আপনি যদি এটিকে সমস্ত প্রশ্নের মধ্যে যোগ করতে না চান তবে এটি ব্যবহার করে দেখুন:

SET search_path TO place;

এখন এটি কাজ করবে:

SELECT * FROM user_place;

0

সবচেয়ে সহজ কাজ হ'ল সারণির নাম এবং সমস্ত কলামের নাম ছোট হাতের অক্ষরে পরিবর্তন করা এবং আপনার সমস্যা সমাধান হবে be

উদাহরণ স্বরূপ:

  • পরিবর্তন Table_Nameকরুনtable_name এবং
  • পরিবর্তন ColumnNameকরুনcolumnname
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.