259

次のPHPスクリプトを実行して、単純なデータベースクエリを実行しようとしています。

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

これにより、次のエラーが発生します。

クエリに失敗しました:エラー:リレーション"sf_bands"が存在しません

すべての例で、関係が存在しないというエラーが発生する場所を見つけることができます。これは、テーブル名に大文字が使用されているためです。テーブル名に大文字がありません。データベース名を含めずにテーブルをクエリする方法はありますshowfinder.sf_bandsか?

4

15 に答える 15

395

私が読んだことから、このエラーはテーブル名を正しく参照していないことを意味します。一般的な理由の 1 つは、テーブルが大文字と小文字が混在するスペルで定義されており、すべて小文字でクエリを実行しようとしている場合です。

つまり、以下は失敗します。

CREATE TABLE "SF_Bands" ( ... );

SELECT * FROM sf_bands;  -- ERROR!

二重引用符を使用して識別子を区切り、テーブルの定義時に特定の大文字と小文字が混在するスペルを使用できるようにします。

SELECT * FROM "SF_Bands";

あなたのコメントについて、「search_path」にスキーマを追加して、スキーマを修飾せずにテーブル名を参照すると、各スキーマを順番にチェックすることでクエリがそのテーブル名と一致するようにすることができます。PATHシェルやPHP などと同じように、include_path現在のスキーマ検索パスを確認できます。

SHOW search_path
  "$user",public

スキーマの検索パスを変更できます。

SET search_path TO showfinder,public;

http://www.postgresql.org/docs/8.3/static/ddl-schemas.htmlも参照してください。

于 2009-03-29T20:25:59.927 に答える
24

Postgres プロセス クエリは、他の RDMS とは異なります。"SCHEMA_NAME"."SF_Bands" のように、テーブル名の前にスキーマ名を二重引用符で囲みます。

于 2012-07-10T20:10:01.303 に答える
22

dbname パラメーターを接続文字列に入れます。他のすべてが失敗している間、それは私にとってはうまくいきます。

また、選択を行うときは、 を指定しますyour_schemayour_tableこのような:

select * from my_schema.your_table
于 2011-03-03T18:38:00.763 に答える
10

スキーマ名とテーブル名は引用符で囲む必要があります。以下のように:

select * from "schemaName"."tableName";
于 2019-09-06T07:38:30.630 に答える
2

上記と同じ問題があり、PostgreSQL 10.5 を使用しています。上記のようにすべてを試しましたが、何も機能していないようです。

次に、pgadmin を閉じて、PSQL ターミナルのセッションを開きました。PSQL にログインし、データベースとスキーマにそれぞれ接続します。

\c <DATABASE_NAME>;
set search_path to <SCHEMA_NAME>;

その後、pgadmin コンソールを再起動すると、pagadmin のクエリ ツールで問題なく動作するようになりました。

于 2021-01-26T15:14:50.897 に答える
2

私にとっての問題は、Django の初期化中にその特定のテーブルへのクエリを使用したことでした。もちろん、これらのテーブルが存在しないため、エラーがスローされます。私の場合、それはget_or_createadmin.py ファイル内のメソッドであり、ソフトウェアが何らかの操作 (この場合は移行) を実行するたびに実行されました。それが誰かを助けることを願っています。

于 2016-04-05T15:30:39.887 に答える
1

最も簡単な回避策は、テーブル名とすべての列名を小文字に変更するだけで問題が解決することです。

例えば:

  • Table_Nametable_name に変更
  • ColumnNameに変更columnname
于 2020-05-07T05:59:12.743 に答える
0

ばかげているかもしれませんが、私の場合、テーブルを作成すると、同じセッションでテーブルをクエリできますが、 new session で再ログインするとtable does not exits

次にcommit、テーブルを作成した直後に使用したところ、新しいセッションでもテーブルを検索してクエリできるようになりました。このような:

select * from my_schema.my_tbl;

これがいくつかの助けになることを願っています。

于 2021-05-19T11:41:05.340 に答える