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

时间:2010-05-05 15:06:56

标签: python sql postgresql

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

如果我创建一个带有大写首字母的表(即Books),当我运行select语句时,psycopg2会返回“Programming Error:relation”books“not exists”错误消息:execute("SELECT * FROM Books")。如果我运行execute("SELECT * FROM books"),则会返回相同的错误。但是,如果我将表格更改为小写的名字(即书籍),则上述任何一种说法都有效。

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

3 个答案:

答案 0 :(得分:8)

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

  • 如果未引用该名称,则会将其转换为小写。否则,它没有受到影响。
  • 之后,尝试区分大小写的匹配

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

The golden rule is consistency

  

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

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

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

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 :(得分:7)

阅读手册中的"Identifiers and Key Words",尤其是有关“引用标识符”的部分。

答案 2 :(得分:2)

我经常不得不将Psycopg2与其他人创建的表格一起使用,并且他们在列名中使用大量案例混合。

我找到的解决方案是使用

from psycopg2.extensions import AsIs

然后将列名放在一个变量中:

column_name = '"Column_Mixed_Case"'#Mind the '" quotes combination !

并将变量传递给sql,如下所示

data = AsIs(column_name)
sql = "select %s from table"
cur.execute(sql,data)