2015-09-15 2 views
2

Поэтому у меня есть список кортежей, как [('Alex', 20), ('Steve', 50)]SQLAlchemy запрос: выбрать, используя список кортежей

Теперь мне нужно стрелять из запроса на выборку по таблице пользователей, чтобы получить соответствующие записи.

Я попробовал это нравится: -

users = [('Alex', 20), ('Steve', 50)] 
names = [r[0] for r in users] 
ages = [r[1] for r in users] 

query = self.session.query(Users).filter(
         and_(Users.name.in_(names), 
         Users.age.in_(ages))) 

Я хочу, чтобы записи с Alex пользователем возраста 20 и Steve пользователей в возрасте 50, но этот запрос также дал бы мне Alex пользователю возраста 50.

Так что этот запрос на самом деле не работает. Нужна помощь в выяснении этого запроса.

+0

Запрос в порядке - вам нужно объяснить, что вы ожидаете, и что не так. Может быть, вы действительно хотите, чтобы пользователи «Alex» возрастом 20 лет и «Стив» в возрасте 50 лет? – sebastian

+0

Да, правильно. Потому что этот запрос также даст пользователю 'Alex' возраст 50'. –

ответ

2

Чтобы получить только пользователь, чьи имя и возраст соответствует вашему users списку вы должны объединить name и age фильтров с AND пунктами и присоединиться к этим в OR пункте. . например:

user_filters = [and_(Users.name == name, Users.age == age) 
       for name, age in users] 
self.session.query(Users).filter(or_(*user_filters)) 
+0

Perfect. Спасибо ... Но 'или' кажется, не нужно. Это действительно необходимо? –

+1

Это необходимо - 'filter (* user_filters)' присоединяется ко всем этим фильтрам с 'AND', что, скорее всего, приведет к пустым результатам, потому что что-то вроде' users.name = "Alex" AND users.name = "Steve" 'не может быть правдой. – sebastian

+0

Охх .... Я пропустил это. Спасибо. –

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