Postgresqlテーブルは存在しますが、クエリ時に「関係が存在しません」と表示されます


83

いくつかのテーブルを持つpostgresqlデータベースがあります。クエリした場合:

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

列を取得できるのにテーブルをクエリできない理由について何か考えはありますか?目標は、テーブルをクエリできるようにすることです。


別のテーブルでも同じことができますか?新しいものを作成してみてください。
フアンカルロスオロペザ2016

2
表示したクエリは機能しません。列名を参照し、にそのような列がないWHERE table_name="my_table";ため"my_table"、は無効information_schema.columnsです。してください編集あなたの質問をし、追加し、正確な create table表を作成するために使用される文を。
a_horse_with_no_name 2016

1
この1チェックしますかdba.stackexchange.com/questions/192897/...
Luv33preet

回答:


93

公開されていない場合は、スキーマを含める必要があります

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

2
正解。SQL標準のクラスター>カタログ>スキーマ>テーブルの階層に精通していない場合は、質問「リレーショナルデータベースのカタログとスキーマの違いは何ですか?」を参照してください私の図
バジルバーク2016

うん-これはそれをやった、どうもありがとう。もちろん今、私は得ていますpermission denied、しかしそれは少なくとも私はどこに行くべきかを知っています。
patkil 2016

4
このスレッドの将来の読者にとって、このエラーは、私の場合と同様に、スキーマ名とテーブル名に大文字と小文字が混在していて、個別に二重引用符で囲まれていない場合にも発生する可能性があります。つまり、「my_Schema」。「my_Table」として指定する必要があります
SnidhiSofpro19年

1
@SnidhiSofproこれはフィールド名でも発生します。私の提案では小文字の名前を使用するだけなので、二重引用符の煩わしさを追加する必要はありません。
フアンカルロスオロペザ

1
すべてSET search_path TO my_schema;がpostgresシェルで機能するが、Pythonコードでは正確に機能しない場合はどうなりますか?大文字と小文字を区別する問題はありません。私は確信しています!
AlexJolig19年

22

あなたが試すことができます:

SELECT * 
FROM public."my_table"

my_tableの近くに二重引用符を付けることを忘れないでください。


3
テーブル名に二重引用符を追加するとうまくいきました。ありがとう。
iAkshay

10

テーブル名には二重引用符を含める必要がありました。

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)

これはpostgres11です。このダンプのCREATETABLEステートメントにも二重引用符があります。

DROP TABLE IF EXISTS "COMMONDATA_NWCG_AGENCIES";

CREATE TABLE "COMMONDATA_NWCG_AGENCIES" (
...

4
もちろん二重引用符が使用されていない限り、Postgresはデフォルトですべてを小文字に変換します。
ArpitSingh19年

3

postgresでダンプされたデータベースからデータを復元した後に発生したのと同じ問題がありました。

私のダンプファイルには、物事が南に向かい始めたところから以下のコマンドがありました。

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

ソリューション:

  1. おそらくそれを削除するか、に変更しfalseてくださいtrue
  2. すべてのテーブルへのアクセスに使用されるプライベートスキーマを作成します。

上記のコマンドは、一般にアクセス可能なすべてのスキーマを非アクティブ化するだけです。

こちらのドキュメントで詳細を確認してください:https//www.postgresql.org/docs/9.3/ecpg-connect.html


1

このエラーは、アクセス制限が原因で発生する可能性があります。解決:

GRANT ALL PRIVILEGES ON DATABASE my_database TO my_user;

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;

これらの引用はすべて「ランダム」に挿入されました。引用符なしでテーブルを削除して再作成する必要がありました。

pgAdmin4.26でテスト済み


0

私の場合、復元したダンプファイルにはこれらのコマンドが含まれていました。

CREATE SCHEMA employees;
SET search_path = employees, pg_catalog;

私はそれらにコメントし、再び復元しました。問題は解決しました


0

このエラーが発生し、接続文字列が別のデータベースを指していることが判明しました。明らかに、テーブルはそこに存在しませんでした。

私はこれに数時間を費やしましたが、接続文字列再確認することについて誰も言及していません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.