sql >> Database >  >> RDS >> PostgreSQL

Psycopg2 houdt niet van tabelnamen die beginnen met een kleine letter

Om aan het andere antwoord toe te voegen, is het gedrag van Postresql over hoofdlettergevoeligheid van identifiers (tabelnamen en kolomnamen):

  • Als de naam niet tussen aanhalingstekens staat, wordt deze omgezet in kleine letters . Anders blijft het onaangeroerd.
  • Daarna een hoofdlettergevoelige overeenkomst wordt geprobeerd.

Dit geldt niet alleen voor queries, maar ook voor schemamanipulatie; in het bijzonder:tafelcreatie.

De gouden regel is consistentie:

Als u draagbare toepassingen wilt schrijven, wordt u geadviseerd om altijd een bepaalde naam te citeren of deze nooit te citeren

Het geposte probleem deed zich waarschijnlijk voor omdat de namen van tabellen en kolommen werden geciteerd op het moment van aanmaak (daarom werden ze niet geconverteerd naar kleine letters). Dus nu moeten ze in alle zoekopdrachten worden geciteerd (en hoofdlettergevoelig).

Normaal gesproken werkt alles zoals verwacht.

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. Wat is SQL?

  2. Op tijd gebaseerde prioriteit in Active Record Query

  3. Oracle 11g krijgt alle overeenkomende voorvallen door een reguliere expressie

  4. SQL Server 2016