2014-02-18 19 views
0

Учитывая таблицу под названием namespace_list с столбцом с именем namespace_ids.Оператор Psycopg2 "не существует: целое число [] = целое число" ошибка

У меня есть следующий запрос:

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, кажется, что у меня есть правильный запрос.

Я следую примеру http://initd.org/psycopg/docs/usage.html#adapt-list. Что-то не так с моим запросом или тем, как я использую массивы с psycopg2?

ответ

2

Проблема заключается в том, что выражение SQL:

<column> = ANY(<array>) 

возвращает истину, если значение скалярной в <column> равно любое значение в <array> сравнении значений по одному. Но ваш столбец не является скалярным значением, это массив, и именно поэтому PostgreSQL говорит:

operator does not exist: integer[] = integer 

Оператор для сравнения массива (слева) для любого целого числа (справа) не существует. Чтобы исправить это, вы можете использовать оператор пересечения (&&) (если вам нужно, чтобы соответствовать только один идентификатор из обоих наборов) или оператора равенства (=), если вы хотите, чтобы соответствовать всем элементам массива:

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

Мне нужно проверить точное совпадение. При выполнении запроса 'SELECT * FROM namespace_list WHERE namespace_ids = ARRAY% s и application_id =% s' с данными' ([1, 2], 1) ', я получаю:' синтаксическая ошибка в точке или рядом "," на символе 64' , Почему он не принимает массив сейчас? – darksky

+0

Потому что это не то, что вы делаете. 'где id = ANY (% s)' работает, потому что слева у вас есть скаляр, а не массив. Но вы сказали, что namespace_ids - это массив ab, поэтому (см. Мой ответ) он не может работать. – fog

Смежные вопросы