web-dev-qa-db-ja.com

PostgreSQLエラー:42P01:リレーション "[テーブル]"は存在しません

Qoutesを使用して作成されたテーブルでPostgreSQL 9.3を使用すると、この奇妙な問題が発生します。たとえば、qoutesを使用してテーブルを作成する場合:

create table "TEST" ("Col1" bigint);

テーブルが適切に作成され、pgAdminIIIのSQLペインで表示すると、引用符が保持されていることがわかります。しかし、DBにクエリを実行して利用可能なすべてのテーブルのリストを検索すると(以下のクエリを使用)、結果にテーブル名を囲む引用符が含まれていないことがわかります。

select table_schema, table_name from information_schema.tables where not table_schema='pg_catalog' and not table_schema='information_schema';

テーブルは引用符で作成されているため、引用符で囲まれておらず、タイトルに投稿されたときにエラーがスローされるため、上記のクエリから返されたテーブル名を直接使用することはできません。

すべてのクエリでテーブル名を引用符で囲むこともできますが、それが常に機能するかどうかはわかりません。結果で引用符で囲まれたテーブル名のリストを取得する方法を探しています。

列名でも同じ問題が発生していますが、テーブル名の問題の解決策が見つかれば、同様の解決策が列名でも機能することを期待しています。

13

次の2つの選択肢があります。-引用符なし:すべてが自動的に小文字になり、大文字と小文字が区別されません-引用符付き:今後はすべて大文字と小文字が区別されます。

引用符を使用せず、PostgreSQLで大文字と小文字を区別しないようにすることを強くお勧めします。それは人生をとても簡単にします。いったん引用すると、PostgreSQLが非常に正確になり始めるので、どこでもそれを使用する必要があります。

いくつかの例:

   TEST = test       <-- non case sensitive
   "Test" <> Test    <-- first is precise, second one is turned to lower case
   "Test" = "Test"   <-- will work
   "test" = TEST     <-- should work; but you are just lucky.

どんな犠牲を払っても、この種の策略を実際に回避しようとします。オブジェクト名は7ビットASCIIのままにします。

25

SQLステートメント文字列の識別子を適切に引用するために使用される文字列関数は quote_ident() であり、これは 良い例 を参照します(関連するquote_literal())。

あなたの例を使用して、他の結果を混ぜるには:

select
   quote_ident(table_schema) as table_schema,
   quote_ident(table_name) as table_name
...

 table_schema |    table_name
--------------+------------------
 ...
 public       | good_name
 public       | "table"
 public       | some_table
 public       | "something else"
 public       | "Tom's work"
 public       | "TEST"
 ...
1
Mike T

NpgパッケージをデータストアORMとして使用しているときに、ORMフレームワーク(この場合はエンティティフレームワーク)がSQLステートメントを生成することを期待していると、PostgreSQLの例外に直面する可能性があります。

テーブルが作成されていないか、生成されたSQLステートメントに何か不足しています。 Visual Studioを使用してデバッグしようとすると、スキーマ名がテーブル名の先頭になっていないことがわかります

_SELECT "ID", "Name", "CreatedBy", "CreatedDate" 
FROM "TestTable"; 
_

postgreSQLはスキーマ名を期待しています。解決策は、DBContextクラスにあり、OnModelCreatingメソッドをオーバーライドしてmodelBuilder.HasDefaultSchema("SchemaName");を追加し、次のような基本コンストラクターを実行します。

_protected override void OnModelCreating(ModelBuilder modelBuilder)   {             
  modelBuilder.HasDefaultSchema("PartyDataManager");                  
  base.OnModelCreating(modelBuilder);         
}
_
1
Wael Al Wirr