Использование или в SQLAlchemy



Я посмотрел по документам и я не могу, кажется, узнать, как сделать запрос или в SQLAlchemy. Я просто хочу сделать этот запрос.



SELECT address FROM addressbook WHERE city='boston' AND (lastname='bulger' OR firstname='whitey')


должно быть что-то вроде



addr = session.query(AddressBook).filter(City == "boston").filter(????)
696   5  

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

    Ничего не найдено.