SQLAlchemy에서 filter와 filter_by의 차이점은 무엇입니까?
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
하여 캐시로 사용할 수있는 것이 중요 합니다 (트랜잭션과 관련됨)
'IT' 카테고리의 다른 글
numpy.array 모양 (R, 1)과 (R,)의 차이점 (0) | 2020.03.26 |
---|---|
하위 디렉토리에 하위 모듈을 추가하려면 어떻게합니까? (0) | 2020.03.26 |
PHPUnit으로 보호 된 메소드를 테스트하는 모범 사례 (0) | 2020.03.26 |
MySQL에서 최대 두 값을 얻는 방법은 무엇입니까? (0) | 2020.03.26 |
time.struct_time 객체를 datetime 객체로 어떻게 변환합니까? (0) | 2020.03.26 |