Может ли кто-нибудь объяснить разницу между функциями filter и filter_by в SQLAlchemy? Я смущен и не могу видеть разницу. Какой я должен использовать?
Какая разница между фильтром и filter_by в SQLAlchemy?
Ответ 1
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'))
Ответ 2
Мы фактически объединили их изначально, то есть был метод "фильтра" -like, который принимал *args и **kwargs, где вы могли передавать выражение SQL или аргументы ключевого слова (или оба). Я на самом деле считаю, что это намного удобнее, но люди всегда были смущены этим, поскольку они обычно все еще преодолевают разницу между column == expression и keyword = expression. Таким образом, мы разделили их.
Ответ 3
filter_by использует аргументы ключевого слова, тогда как filter допускает аргументы фильтрации pythonic, такие как filter(User.name=="john")
Ответ 4
Это синтаксический сахар для более быстрого написания запросов. Его реализация в псевдокоде:
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 важно, чтобы объект можно было возвращать без запроса к базе данных из identity map, который можно использовать как кеш (связанный с транзакцией)
Ответ 5
разница между 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