누구든지 SQLAlchemy의 기능 filter
과 차이점을 설명 할 수 filter_by
있습니까? 어느 것을 사용해야합니까?
답변
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'))
답변
우리는 실제로 이것들을 원래 하나로 합쳤습니다. 즉, “필터”와 같은 메소드가 *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))
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
하여 캐시로 사용할 수있는 것이 중요 합니다 (트랜잭션 관련)