В чем разница между filter и filter by в SQLAlchemy?



может ли кто-нибудь объяснить разницу между filter и filter_by функции в SQLAlchemy? Я в замешательстве и не вижу разницы. Какой из них я должен использовать?

577   5  

5 ответов:

filter_by используется для простых запросов на имена столбцов с использованием обычных кваргов, таких как

db.users.filter_by(name='Joe')

то же самое можно сделать с filter, не используя kwargs, а вместо этого используя оператор равенства'==', который был перегружен на db.users.name объект:

db.users.filter(db.users.name=='Joe')

вы также можете писать более мощные запросы с помощью filter, например, такие выражения, как:

db.users.filter(or_(db.users.name=='Ryan', db.users.country=='England'))

мы фактически объединили их вместе изначально, т. е. был "фильтр"-подобный метод, который принимал *args и **kwargs, где вы могли передать выражение SQL или аргументы ключевого слова (или оба). Я на самом деле считаю, что намного удобнее, но люди всегда были смущены этим, так как они обычно все еще преодолевают разницу между column == expression и keyword = expression. Поэтому мы разделили их.

filter_by использует ключевые аргументы, тогда как filter позволяет данные доводы фильтрации, такие как filter(User.name=="john")

это синтаксический сахар для более быстрого написания запросов. Его реализация в псевдокоде:

def filter_by(self, **kwargs):
    return self.filter(sql.and_(**kwargs))

и вы можете просто написать:

session.query(db.users).filter_by(name='Joe', surname='Dodson')

кстати

session.query(db.users).filter(or_(db.users.name=='Ryan', db.users.country=='England'))

можно записать как

session.query(db.users).filter((db.users.name=='Ryan') | (db.users.country=='England'))

также вы можете получить объект непосредственно PK через get способ:

Users.query.get(123)
# And even by a composite PK
Users.query.get(123, 321)

при использовании get case важно, что объект может быть возвращен без запроса базы данных от identity map который может использоваться как кэш (связанный с транзакция)

разницу между filter() и filter_by() Это первый(filter()) работает как or (||) заявления и filter_by() работы как and (&&) заявление. filter() вычисляет true, если любой из предоставленных аргументов True. Он сравнивает его с равным знаку ==. В то время как filter_by() оценивает True если и только если все приведенные аргументы равны True. Таким образом, следует проявлять осторожность при вызове каждой функции, поскольку они не оценивают свои аргументы в одном и том же путь. Проверьте этот пример ниже:

borrowedlist = Borrowedbooks.query.filter_by(bookid = bookid, userid = userid, status = 'false').first()
        if borrowedlist == None:
            return None
        return borrowedlist

вернутся True если и только если все аргументы возвращает True в то время как:

borrowedlist = Borrowedbooks.query.filter(bookid == bookid, userid == userid, status == 'false').first()
        if borrowedlist == None:
            return None
        return borrowedlist

вернутся True если какой-либо из приведенных аргументов вычисляет True

Comments

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