wake-up-neo.net

PostgreSQL-FEHLER: 42P01: Relation "[Tabelle]" ist nicht vorhanden

Ich habe dieses seltsame Problem bei der Verwendung von PostgreSQL 9.3 mit Tabellen, die mit Qoutes erstellt wurden. Wenn ich zum Beispiel eine Tabelle mit qoutes erstelle:

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

die Tabelle ist ordnungsgemäß erstellt und ich kann sehen, dass die Anführungszeichen beibehalten werden, wenn Sie sie im SQL-Fenster von pgAdminIII anzeigen. Wenn ich jedoch die Datenbank abfrage, um die Liste aller verfügbaren Tabellen zu finden (mit der folgenden Abfrage), sehe ich, dass das Ergebnis keine Anführungszeichen um den Tabellennamen enthält.

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

Da die Tabelle mit Anführungszeichen erstellt wurde, kann ich den von der obigen Abfrage zurückgegebenen Tabellennamen nicht direkt verwenden, da er nicht in Anführungszeichen steht und den Fehler in der Überschrift im Titel auslöst.

Ich könnte versuchen, die Tabellennamen in allen Abfragen in Anführungszeichen zu setzen, aber ich bin nicht sicher, ob es die ganze Zeit funktionieren wird. Ich suche nach einer Möglichkeit, die Liste der Tabellennamen zu erhalten, die im Ergebnis in Anführungszeichen stehen.

Ich habe das gleiche Problem mit Spaltennamen, aber ich hoffe, dass eine ähnliche Lösung auch für Spaltennamen funktioniert, wenn ich eine Lösung für das Tabellennamenproblem finden kann.

7

sie haben zwei Möglichkeiten: - keine Anführungszeichen: dann wird alles automatisch Kleinbuchstaben sein und nicht zwischen Groß- und Kleinschreibung unterscheiden - mit Anführungszeichen: von nun an ist alles case sensitive.

ich würde dringend empfehlen, KEINE Anführungszeichen zu verwenden und PostgreSQL dazu zu bringen, sich nicht auf Groß- und Kleinschreibung zu beziehen. es macht das Leben so viel einfacher. Sobald Sie mit dem Zitieren begonnen haben, müssen Sie es ÜBERALL verwenden, da PostgreSQL sehr präzise wird.

ein Beispiel:

   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.

versuchen Sie wirklich, diese Art von Tricks um jeden Preis zu vermeiden. Bleiben Sie bei 7-Bit-ASCII für Objektnamen.

17

Eine Zeichenfolgenfunktion, die verwendet wird, um Bezeichner in einer SQL-Anweisungszeichenfolge in geeigneter Weise zu zitieren, ist quote_ident() , die auf ein good example verweist (wird in Verbindung mit verwandten quote_literal() verwendet).

Um Ihr Beispiel zu verwenden und andere Ergebnisse zu mischen:

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"
 ...
0
Mike T

Wenn Sie das npg-Paket als Datenspeicher-ORM verwenden, erwarten Sie, dass das ORM-Framework (in unserem Fall Entity Framework) die SQL-Anweisung generiert, bei der möglicherweise eine PostgreSQL-Ausnahme auftritt. Die Beziehung 'Tabellenname' existiert nicht

Entweder wird die Tabelle nicht erstellt oder in der generierten SQL-Anweisung fehlt etwas. Wenn Sie versuchen, mit Visual Studio zu debuggen, werden Sie feststellen, dass der Schemaname nicht vor dem Tabellennamen steht

SELECT "ID", "Name", "CreatedBy", "CreatedDate" 
FROM "TestTable"; 

während PostgreSQL den Schemanamen erwartet. Die Auflösung in der DBContext-Klasse überschreibt die OnModelCreating-Methode und fügt modelBuilder.HasDefaultSchema("SchemaName"); hinzu und führt den Basiskonstruktor aus, der wie folgt aussehen sollte

protected override void OnModelCreating(ModelBuilder modelBuilder)   {             
  modelBuilder.HasDefaultSchema("PartyDataManager");                  
  base.OnModelCreating(modelBuilder);         
}
0
Wael Al Wirr