답변:
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)
위의 데모에서와 같이 사용해야 합니다. 나는 오늘 일찍이 실수를했다.
우리는 실제로 이것들을 원래 하나로 합쳤습니다. 즉, "필터"와 같은 메소드가 *args
있었고 **kwargs
, 여기에는 SQL 표현식이나 키워드 인수 (또는 둘 다)를 전달할 수 있습니다. 나는 실제로는 훨씬 더 편리하게 찾을 수 있지만, 일반적으로 여전히 사이의 차이를 극복하고 있기 때문에 사람들은 항상 그 혼란 한 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')
btw
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'
일정을 한 번 평가 한 다음에 다음에서 의미가? 이것이 작동하려면 람다를 사용해야 할 것 같습니다.