Предложение IN с целыми числами в sqlalchemy / psycopg2 - PullRequest
8 голосов
/ 24 октября 2009

Просто новичок с комбо python / postgres, так что простите, если это тривиально. Я выполняю необработанный SQL-запрос с sqlalchemy по направлениям:

SELECT * FROM table WHERE pk_table_id IN ()

В приведенном ниже примере я попытался self.ids как кортеж, содержащий строку или целые числа, а также массив, содержащий строку или целые числа. В любом случае это не сработало.

Когда я использую эту строку:

my_connection.execute('SELECT * FROM public.table WHERE pk_table_id IN (%s)', self.ids)

Я получаю ошибку:

TypeError: not all arguments converted during string formatting

Есть предложения?

Ответы [ 5 ]

7 голосов
/ 19 декабря 2012

Вы можете использовать метод cur.mogrify :

cur = my_connection.cursor()
cur.execute(cur.mogrify('SELECT * FROM public.table WHERE pk_table_id IN %s', (tuple(self.ids),)))
6 голосов
/ 30 октября 2009

Я закончил тем, что бросил SqlAlchemy для прямой psycopg2, поэтому я не знаю, применимо ли это на 100% Я обнаружил, что psycopg2 правильно скомпилирует предложение IN, если вы передадите ему кортеж, а не массив / список. Я передал кортеж целых чисел, и он работал просто отлично.

3 голосов
/ 24 октября 2009

Заполнитель %s в execute ожидает скаляр, а не кортеж. Вам нужно либо заменить его на ','.join(('%s',) * len(mytuple)), либо использовать вместо него замену строки!

2 голосов
/ 29 января 2015

если ваши идентификаторы находятся в списке, вы можете использовать адаптацию списка:

my_connection.execute('SELECT * FROM public.table WHERE pk_table_id = ANY(%s)', (self.ids,))

Взято из списков-приспособлений

0 голосов
/ 24 октября 2009

если self.ids является массивом, у вас возникнет проблема при выполнении преобразования в операторе execute. Вместо этого вы должны сделать это как строковую операцию перед вызовом оператора execute.

Попробуйте это:

my_connection.execute('SELECT * FROM public.table WHERE pk_table_id IN (%s)' % 
                      ",".join(str(x) for x in self.ids))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...