PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Psycopg2 não gosta de nomes de tabelas que começam com uma letra minúscula


Para adicionar à outra resposta, o comportamento do Postresql sobre a distinção entre maiúsculas e minúsculas de identificadores (nomes de tabelas e nomes de colunas) é:
  • Se o nome não estiver entre aspas, ele será convertido em minúsculas . Caso contrário, ele permanece intocado.
  • Depois, uma correspondência com distinção entre maiúsculas e minúsculas é tentado.

Isso se aplica não apenas a consultas, mas também à manipulação de esquemas; em particular:criação de tabelas.

A regra de ouro é a consistência:

Se você deseja escrever aplicativos portáteis,éaconselhá-lo a sempre citar um nome em particular ou nunca citá-lo

O problema postado surgiu, provavelmente, porque os nomes das tabelas e colunas foram citados no momento da criação (portanto, não foram convertidos para minúsculas). Portanto, agora eles devem ser citados (e diferenciam maiúsculas de minúsculas) em todas as consultas.

Normalmente, tudo funciona como esperado.
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