回答:
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'))
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)
(上記でデモしたように)使用する必要があります。私は今日早くこの間違いをしました。
実際には、これらを元々マージしていました。つまり、SQL式またはキーワード引数(またはその両方)を渡すことができる*args
and を受け入れる「フィルター」のようなメソッドがありました**kwargs
。実際にははるかに便利だと思いますが、column == expression
との違いはまだ解消されていないため、人々は常に混乱していましたkeyword = expression
。したがって、それらを分割します。
column == expression
対のkeyword = expression
間の違いについて作るために重要なポイントであるfilter
とfilter_by
。ありがとう!
filter_by
より少し速いかもしれないと思っていましたfilter
。
filter_by
、そのクラスのフィールド名を記述できることです。flter
実際の列オブジェクトが必要ですが、通常、少なくとも冗長なクラス名を入力(および読み取る)する必要があります。したがって、等式でフィルタリングする場合は、かなり便利です。
これは、クエリの書き込みを高速化するための構文シュガーです。擬似コードでのその実装:
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'))
また、get
メソッドを介してPKでオブジェクトを直接取得することもできます。
Users.query.get(123)
# And even by a composite PK
Users.query.get(123, 321)
get
ケースを使用する場合、identity map
キャッシュとして使用できるデータベースリクエストなしでオブジェクトを返すことができることが重要です(トランザクションに関連付けられています)。
db.users.name=='Ryan'
定数に一度評価し、その後に続いから意味が?これを機能させるにはラムダを使用する必要があるようです。