I am running ActiveState's ActivePython 2.6.5.12 and PostgreSQL 9.0 Beta 1 under Windows XP.
If I create a table with an upper case first letter (i.e. Books), psycopg2 returns the "Programming Error: relation "books" does not exist" error message when I run the select statement: execute("SELECT * FROM Books")
. The same error is returned if I run: execute("SELECT * FROM books")
. However, if I change the table to a lower case first name (i.e. books), then either of the above statements works.
Are tables name supposed to have a lower case first name? Is this a setting or a feature or a bug? Am I missing something obvious?
PostgreSQL names are case sensitive.
Postgres stores unquoted column names in lowercase. The column names in a select statement are not case sensitive unless quoted.
Capitalization. Use sentence-style capitalization for the table title and each column heading. Use sentence-style capitalization for the text in cells unless there's a reason not to (for example, keywords that must be lowercase).
To add to the other answer, the behaviour of Postresql about case-sentivity of identifiers (table names and column names) is :
This applies not only for queries, but also for schema manipulation; in particular: table creation.
The golden rule is consistency:
If you want to write portable applications you are advised to always quote a particular name or never quote it
The posted problem arose, probably, because the tables and columns names were quoted at creation time (hence, they were not converted to lowercase). So, now they must be quoted (and case-sensitive) in all queries.
Normally, all works as expected.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With