【问题标题】:Psycopg2 doesn't like table names that start with a lower case letterPsycopg2 不喜欢以小写字母开头的表名
【发布时间】:2010-05-05 15:06:55
【问题描述】:

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

如果我创建一个首字母大写的表(即 Books),psycopg2 在我运行 select 语句时返回“编程错误:关系“books”不存在”错误消息:execute("SELECT * FROM Books")。如果我运行:execute("SELECT * FROM books"),则会返回相同的错误。但是,如果我将表格更改为小写名字(即书籍),则上述任一语句都有效。

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

【问题讨论】:

  • 标题不应该说“Psycopg2 不喜欢以大写字母开头的表名”吗?

标签: python sql postgresql


【解决方案1】:

补充另一个答案,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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 嘘!所以 "execute('SELECT * FROM "Books"') 有效。而且由于我也将列名大写,所以我必须使用 "execute('SELECT "Title" FROM "Books"')。在 PostgreSQL 数据库中始终使用小写表和字段名称是“标准”还是公认的方法?
    • 将所有标识符写成小写(并用下划线分隔单词)是一种约定,主要是为了方便。关于解析器所谓的“大小写折叠”——SQL 标准规定了这种行为(有一个区别——当不加引号时,标识符被折叠为大写)。
    • 引用标识符是 MSSQL 开发人员似乎喜欢的事情。但大多数其他数据库开发人员往往不会这样做。如果您在创建表、视图、函数时不引用标识符,那么您不必担心以后引用它们。如果您不引用,Postgres 将折叠为小写,而 Oracle 将折叠为大写。
    • 只是为了补充 Scott 所说的:解决方案是将区分大小写的表或列名放在引号中。 (在引号想法中使用python的引号)如果对于那些不知道标识符是什么的人来说。 (像我一样:)
    【解决方案3】:

    我经常必须将 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)
    

    【讨论】:

      猜你喜欢
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      相关资源
      最近更新 更多