2014-02-18 64 views
0

給定一個名爲namespace_list的表,其中INTEGER[]列爲namespace_idsPsycopg2「operator does not exist:integer [] = integer」error

我有以下查詢:

query = SELECT * FROM namespace_list WHERE namespace_ids = ANY(%s) 
and application_id=%s 

這我作爲執行:

cur.execute(query, data) 

以及其中數據是:

data = ([1, 2], 1) 

我收到以下錯誤:

operator does not exist: integer[] = integer at character 50\nHINT: 
No operator matches the given name and argument type(s). 
You might need to add explicit type casts. 

爲什麼這不起作用?看看http://www.postgresql.org/message-id/[email protected]om和其他關於Postgres Arrays的教程,似乎我有正確的查詢。

我跟着http://initd.org/psycopg/docs/usage.html#adapt-list也有一個例子。我的查詢有什麼問題,或者我使用psycopg2數組的方式?

回答

2

的問題是,SQL表達式:

<column> = ANY(<array>) 

返回true如果在<column>值在<array>等於任何值進行比較的值一個接一個。但是,你的列不是標量值,它是一個數組,這就是爲什麼說的PostgreSQL:

operator does not exist: integer[] = integer 

的運算符來比較數組(左)到任意整數(右)不存在。爲了解決這個問題,如果你想匹配所有的數組元素,你可以使用一個相交的操作(&&)(如果你需要匹配兩套只是一個ID)或等號(=):

SELECT * FROM namespace_list WHERE namespace_ids && %s and application_id=%s 

訣竅這裏是psycopg將Python列表轉換爲文字數組(ARRAY[...]),您可以在標準SQL中使用它們的任何位置使用它們。

+0

怎麼回事? Psycopg2表示我們可以這樣做:'ids = [10,20,30]cur.execute(「SELECT * FROM data WHERE id = ANY(%s);」,(ids,))''。這正是我正在做的。 – darksky

+0

我需要檢查完全匹配。當使用數據'([1,2],1)'進行查詢'SELECT * FROM namespace_list WHERE namespace_ids = ARRAY%s和application_id =%s'時,我得到:'語法錯誤在或接近於','在字符64' 。爲什麼現在不接受數組? – darksky

+0

因爲這不是你在做什麼。 'where id = ANY(%s)'因爲在左邊你有一個標量而不是數組。但是你說namespace_ids是ab數組,所以(看我的答案)它不起作用。 – fog