Может ли кто-нибудь объяснить разницу между функциями filter
и filter_by
функциями в SQLAlchemy? Какой из них я должен использовать?
python
sqlalchemy
bodacydo
источник
источник
db.users.name=='Ryan'
оценили бы один раз как константу, а потом были бы бессмысленными с тех пор? Кажется, что для этого нужно использовать лямбду.type(model.column_name == 'asdf')
→sqlalchemy.sql.elements.BinaryExpression
.filter
. запрос, какid=12345
,query(users).filter(id == id)
не будет фильтроватьusers.id
. Вместо этого, он будет оценивать ,id == id
какTrue
и вернуть все пользователь. Вы должны использовать.filter(users.id == id)
(как показано выше). Я сделал эту ошибку сегодня утром.Мы фактически объединили их изначально, то есть был метод, похожий на «фильтр», который принимал
*args
и**kwargs
, где вы могли передать выражение SQL или аргументы ключевого слова (или оба). Я на самом деле считаю, что это намного удобнее, но люди всегда были смущены этим, так как они обычно все еще преодолевают разницу междуcolumn == expression
иkeyword = expression
. Таким образом, мы разделили их.источник
column == expression
против»keyword = expression
- это ключевой момент, который необходимо учитывать в отношении разницы междуfilter
иfilter_by
. Спасибо!filter_by
может быть немного быстрее, чемfilter
.filter_by
заключается в том, чтобы иметь возможность написать просто имя поля, для этого класса, без вопросов - хотяflter
требуется фактический объект столбца - который обычно требует, чтобы он набрал (и прочитал) хотя бы избыточное имя класса. Итак, если кто-то хочет отфильтровать по равенству, это довольно удобно.filter_by
использует аргументы ключевых слов, тогда какfilter
разрешает питонную фильтрацию аргументов, таких какfilter(User.name=="john")
источник
Это синтаксический сахар для более быстрого написания запросов. Его реализация в псевдокоде:
Для AND вы можете просто написать:
кстати
можно записать как
Также вы можете получить объект напрямую с помощью
get
метода PK :При использовании
get
регистра важно, чтобы объект можно было возвращать без запроса к базе данных, изidentity map
которого можно использовать кеш (связанный с транзакцией).источник
users.filter
из предыдущего ответа. И, может быть, это моя вина :)query
Атрибут query_property и его довольно стандартный сахар в наши дни