В чем разница между filter и filter_by в SQLAlchemy? - PullRequest
255 голосов
/ 24 января 2010

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

Ответы [ 4 ]

321 голосов
/ 24 января 2010

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

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'))

107 голосов
/ 29 января 2010

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

33 голосов
/ 24 января 2010

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

28 голосов
/ 22 июля 2015

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

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

Для AND вы можете просто написать:

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, который можно использовать как кэш (связанный с транзакцией)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...