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)при использовании
getcase важно, что объект может быть возвращен без запроса базы данных от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