我在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")
,则会返回相同的错误。但是,如果我将表格更改为小写的名字(即书籍),则上述任何一种说法都有效。
表名是否应该具有小写的名字?这是设置或功能还是错误?我错过了一些明显的东西吗?
答案 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)