sql >> Database teknologi >  >> RDS >> PostgreSQL

Psycopg2 kan ikke lide tabelnavne, der starter med et lille bogstav

For at føje til det andet svar er Postresql's adfærd med hensyn til case-sensitivitet af identifikatorer (tabelnavne og kolonnenavne):

  • Hvis navnet ikke er citeret, konverteres det til små bogstaver . Ellers forbliver den urørt.
  • Derefter vises et skiftefølsomt match er forsøgt.

Dette gælder ikke kun for forespørgsler, men også for skemamanipulation; i særdeleshed:tabeloprettelse.

Den gyldne regel er konsistens:

Hvis du vil skrive bærbare applikationer, rådes du til altid at citere et bestemt navn eller aldrig citere det

Det postede problem opstod sandsynligvis, fordi tabellernes og kolonnenavnene blev citeret på oprettelsestidspunktet (derfor blev de ikke konverteret til små bogstaver). Så nu skal de citeres (og skelnes mellem store og små bogstaver) i alle forespørgsler.

Normalt fungerer alt som forventet.

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


  1. Sådan læser og analyserer du SQL Server-udførelsesplaner

  2. Opret bruger fra strengvariabler i en PL/SQL-blok

  3. PostgreSQL - forespørgsel fra bash script som databasebruger 'postgres'

  4. Er det en dårlig idé at have et 'ELLER' i en INNER JOIN-tilstand?