Использование или в SQLAlchemy
Я посмотрел по документам и я не могу, кажется, узнать, как сделать запрос или в SQLAlchemy. Я просто хочу сделать этот запрос.
SELECT address FROM addressbook WHERE city='boston' AND (lastname='bulger' OR firstname='whitey')
должно быть что-то вроде
addr = session.query(AddressBook).filter(City == "boston").filter(????)
5 ответов:
С учебник:
from sqlalchemy import or_ filter(or_(User.name == 'ed', User.name == 'wendy'))
SQLAlchemy перегружает побитовые операторы
&,|и~поэтому вместо уродливого и трудночитаемого синтаксиса префикса сor_()иand_()(как в Бастьена) можно использовать следующие операторы:.filter((AddressBook.lastname == 'bulger') | (AddressBook.firstname == 'whitey'))обратите внимание, что скобки не обязательно из-за старшинства побитовых операторов.
так что весь ваш запрос может выглядеть так:
addr = session.query(AddressBook) \ .filter(AddressBook.city == "boston") \ .filter((AddressBook.lastname == 'bulger') | (AddressBook.firstname == 'whitey'))
or_ оператор может быть полезен в случае неизвестного количества или компонентов запроса.
query = Book.query if filter.title and filter.author: query = query.filter((Book.title.ilike(filter.title))|(Book.author.ilike(filter.author))) else if filter.title: query = query.filter(Book.title.ilike(filter.title)) else if filter.author: query = query.filter(Book.author.ilike(filter.author))С помощью функции or_ его можно переписать на:
query = Book.query not_null_filters = [] if filter.title: not_null_filters.append(Book.title.ilike(filter.title)) if filter.author: not_null_filters.append(Book.author.ilike(filter.author)) if len(not_null_filters) > 0: query = query.filter(or_(*not_null_filters))
Это было очень полезно. Вот моя реализация для любой данной таблицы:
def sql_replace(self, tableobject, dictargs): #missing check of table object is valid primarykeys = [key.name for key in inspect(tableobject).primary_key] filterargs = [] for primkeys in primarykeys: if dictargs[primkeys] is not None: filterargs.append(getattr(db.RT_eqmtvsdata, primkeys) == dictargs[primkeys]) else: return query = select([db.RT_eqmtvsdata]).where(and_(*filterargs)) if self.r_ExecuteAndErrorChk2(query)[primarykeys[0]] is not None: # update filter = and_(*filterargs) query = tableobject.__table__.update().values(dictargs).where(filter) return self.w_ExecuteAndErrorChk2(query) else: query = tableobject.__table__.insert().values(dictargs) return self.w_ExecuteAndErrorChk2(query) # example usage inrow = {'eqmtvs_id': eqmtvsid, 'datetime': dtime, 'param_id': paramid} self.sql_replace(tableobject=db.RT_eqmtvsdata, dictargs=inrow)
or_ это встроенная функция sqlalchemy из sqlalchemy import or_
query = db.сессия.запрос(адресная книга).фильтр (or_ (адресная книга.Балджер "фамилия"=='', адресная книга.firstname== 'whitey')).фильтр (адресная книга.city= = 'boston')
Comments