SQLAlchemy에서 filter와 filter_by의 차이점


304

누구든지 SQLAlchemy의 기능 filter과 차이점을 설명 할 수 filter_by있습니까? 어느 것을 사용해야합니까?

답변:


393

filter_by 일반 kwargs를 사용하여 열 이름에 대한 간단한 쿼리에 사용됩니다.

db.users.filter_by(name='Joe')

filterkwargs를 사용하지 않고 db.users.name 객체에 오버로드 된 '=='항등 연산자를 사용하여 동일하게 수행 할 수 있습니다 .

db.users.filter(db.users.name=='Joe')

다음 filter과 같은 표현식을 사용하여보다 강력한 쿼리를 작성할 수도 있습니다 .

db.users.filter(or_(db.users.name=='Ryan', db.users.country=='England'))


22
이것이 후드 아래에서 어떻게 작동합니까? 하지 않을까요 db.users.name=='Ryan'일정을 한 번 평가 한 다음에 다음에서 의미가? 이것이 작동하려면 람다를 사용해야 할 것 같습니다.
Hamish Grubijan 2013

46
항등 연산자는 오버로드
다니엘 Velkov을

9
type(model.column_name == 'asdf')sqlalchemy.sql.elements.BinaryExpression
Nick T

11
사용시주의하십시오 .filter. 같은 쿼리 id=12345, query(users).filter(id == id)필터링되지 않습니다 users.id. 대신 모든 사용자 id == id로 평가 True하여 반환합니다. .filter(users.id == id)위의 데모에서와 같이 사용해야 합니다. 나는 오늘 일찍이 실수를했다.
Nico Cernek

118

우리는 실제로 이것들을 원래 하나로 합쳤습니다. 즉, "필터"와 같은 메소드가 *args있었고 **kwargs, 여기에는 SQL 표현식이나 키워드 인수 (또는 둘 다)를 전달할 수 있습니다. 나는 실제로는 훨씬 더 편리하게 찾을 수 있지만, 일반적으로 여전히 사이의 차이를 극복하고 있기 때문에 사람들은 항상 그 혼란 한 column == expressionkeyword = expression. 그래서 우리는 그것들을 나누었습니다.


30
나는 약 요점 생각 column == expression대이 keyword = expression차이에 대해 키 포인트입니다 filterfilter_by. 감사!
Hollister

2
나는 sqlalchemy를 처음 사용하므로 이것이 멍청한 질문이라면 실례지만 filter_by ()는 "price> = 100"과 같은 매우 간단한 조건조차 허용하지 않는 것 같습니다. 그렇다면 "price = 100"과 같은 가장 간단한 조건에서만 사용할 수 있다면 왜 filter_by () 함수가 있습니까?
PawelRoman

18
사람들은 그것을 좋아하기 때문에
zzzeek

3
그들 사이에 성능 차이가 있습니까? 나는 그것 filter_by보다 조금 빠를 것이라고 생각했다 filter.
데비

6
사용의 요점은 filter_by해당 클래스에 대해 필드 이름을 쓸 수 있으며 flter, 실제 열 객체가 필요하지만 일반적으로 최소한 중복 클래스 이름을 입력하고 읽을 수있는 객체가 필요하다는 것입니다. 따라서 평등으로 필터링하려면 오히려 편리합니다.
jsbueno

36

filter_by키워드 인수를 사용하지만 다음 filter과 같은 파이썬 필터링 인수를 허용합니다.filter(User.name=="john")


34

빠른 쿼리 작성을위한 구문 설탕입니다. 의사 코드의 구현 :

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하여 캐시로 사용할 수있는 것이 중요 합니다 (트랜잭션 관련)


이러한 코드 예제는 잘못된 것입니다. 선언적 기본 테이블 클래스 및 인스턴스에는 필터 또는 쿼리 메소드가 없습니다. 그들은 세션을 사용합니다.
Turtles are Cute

나는 users.filter이전의 답변에서 재현 합니다. 그리고는 내 잘못이있을 수 있습니다 :) query속성은 QUERY_PROPERTY 요즘은 꽤 표준 설탕
enomad
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.