PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Psycopg2 mag keine Tabellennamen, die mit einem Kleinbuchstaben beginnen

Um die andere Antwort zu ergänzen, ist das Verhalten von Postresql in Bezug auf die Groß- und Kleinschreibung von Bezeichnern (Tabellennamen und Spaltennamen) :

  • Wenn der Name nicht in Anführungszeichen steht, wird er in Kleinbuchstaben umgewandelt . Andernfalls bleibt es unberührt.
  • Danach ein Match mit Berücksichtigung der Groß-/Kleinschreibung wird versucht.

Dies gilt nicht nur für Abfragen, sondern auch für Schemamanipulationen; insbesondere:Tabellenerstellung.

Die goldene Regel ist Konsistenz:

Wenn Sie portable Anwendungen schreiben möchten, sollten Sie immer einen bestimmten Namen angeben oder niemals angeben

Das gepostete Problem entstand wahrscheinlich, weil die Tabellen- und Spaltennamen zum Zeitpunkt der Erstellung in Anführungszeichen gesetzt wurden (daher wurden sie nicht in Kleinbuchstaben umgewandelt). Daher müssen sie jetzt in allen Abfragen in Anführungszeichen (und Groß-/Kleinschreibung) gesetzt werden.

Normalerweise funktioniert alles wie erwartet.

db=# create table Xxx (id integer); -- unquoted, will be converted to lowercase
CREATE TABLE
db=# select * from xXx;    -- this works ok
id
----
(0 rows)
db=# create table "Xxxx" (id integer);  -- will be left untouched
CREATE TABLE
db=# select * from xxxx;                -- bad
ERROR:  relation "xxxx" does not exist
LINE 1: select * from xxxx;
db=# select * from Xxxx;                -- bad
ERROR:  relation "xxxx" does not exist
LINE 1: select * from Xxxx;
^
db=# select * from "Xxxx";               -- ok
id
----
(0 rows)

db=# \dt *xx*
List of relations
Schema | Name | Type  |  Owner
--------+------+-------+----------
public | Xxxx | table | postgres
public | xxx  | table | postgres