Psycopg2不喜欢以小写字母开头的表名

Cou*_*xer 7 python sql postgresql

我在Windows XP下运行ActiveState的ActivePython 2.6.5.12和PostgreSQL 9.0 Beta 1.

如果我创建一个带有大写首字母的表(即Books),当我运行select语句时,psycopg2会返回"Programming Error:relation"书籍"不存在"错误消息:execute("SELECT * FROM Books").如果我运行,则会返回相同的错误:execute("SELECT * FROM books").但是,如果我将表更改为小写的第一个名称(即书籍),则上述任一语句都可以.

表名是否应该具有小写的名字?这是设置或功能还是错误?我错过了一些明显的东西吗

leo*_*loy 9

要添加到另一个答案,Postresql关于标识符(表名和列名)的大小写的行为是:

  • 如果未引用该名称,则将其转换为小写.否则,它保持不变.
  • 然后,尝试区分大小写的匹配.

这不仅适用于查询,也适用于模式操作; 特别是:表创建.

黄金法则是一致性:

如果您想编写便携式应用程序,建议您始终引用特定名称或从不引用它

发布的问题可能是因为表和列名称在创建时被引用(因此,它们未转换为小写).因此,现在必须在所有查询中引用它们(并区分大小写).

通常,所有工作都按预期进行.

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
Run Code Online (Sandbox Code Playgroud)


Mil*_*dev 7

阅读手册中的"标识符和关键词",特别是关于"引用标识符"的部分.

  • 好哇!因此"执行('SELECT*FROM"Books"')有效.而且由于我也将列名称大写,我必须使用"execute('SELECT"Title"FROM"Books"').在PostgreSQL数据库中始终使用小写表和字段名称是"标准"还是可接受的方法? (6认同)