2010-05-05 21 views
4

我在Windows XP下運行ActiveState的ActivePython 2.6.5.12和PostgreSQL 9.0 Beta 1。Psycopg2不喜歡以小寫字母開頭的表名

如果我使用大寫的第一個字母(即Books)創建表,psycopg2在運行select語句時返回「編程錯誤:關係」書籍「不存在」錯誤消息:execute("SELECT * FROM Books")。如果我運行,返回相同的錯誤:execute("SELECT * FROM books")。但是,如果我將表格更改爲小寫的第一個名稱(即書籍),那麼以上任何一種說法都適用。

表名應該有一個小寫的名字?這是一個設置或功能還是錯誤?我錯過了明顯的東西嗎?

回答

5

從手冊中閱讀"Identifiers and Key Words",特別是關於「引用標識符」的部分。

+4

Huzzah!所以「執行('SELECT * FROM'Books'')是有效的。因爲我也大寫了我的列名,我必須使用」execute('SELECT'Title'FROM'Books'')。 它是在PostgreSQL數據庫中始終使用小寫表和字段名稱的「標準」還是可接受的方法? – 2010-05-05 15:37:01

+0

以小寫形式書寫所有標識符(並用下劃線分隔單詞)是一種慣例,主要是爲了方便。關於解析器所謂的「case-folding」 - SQL標準規定了這種行爲(有一點不同 - 當不加引號時,標識符被摺疊爲大寫)。 – 2010-05-05 17:56:33

+1

引用標識符是MSSQL開發者似乎喜歡的東西。但大多數其他數據庫開發人員往往不這樣做。如果您在創建表格,視圖和函數時未引用標識符,則不必擔心以後引用它們。如果你不引用,Postgres會摺疊到小寫,而Oracle會做大寫。 – 2010-05-05 18:20:52

8

要添加到對方的回答,Postresql的有關標識符(表名和列名)的情況下,sentivity的行爲是:

  • 如果該名稱沒有加引號,將它轉換爲小寫 。否則,它保持不變。
  • 之後,嘗試了區分大小寫匹配

這不僅適用於查詢,也適用於模式操作;特別是:創建表格。

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

張貼的問題出現,很可能是因爲表和列名字被創建時引用(因此,他們並沒有轉換爲小寫)。所以,現在他們必須在所有查詢中引用(並區分大小寫)。

通常情況下,所有工作都按預期工作。

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 
+0

+1例如和解釋。 – 2013-07-19 17:48:35

1

我經常要使用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) 
相關問題