[python] SQLAlchemy에서 filter와 filter_by의 차이점

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



답변

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'))


답변

우리는 실제로 이것들을 원래 하나로 합쳤습니다. 즉, “필터”와 같은 메소드가 *args있었고 **kwargs, 여기에는 SQL 표현식이나 키워드 인수 (또는 둘 다)를 전달할 수 있습니다. 나는 실제로는 훨씬 더 편리하게 찾을 수 있지만, 일반적으로 여전히 사이의 차이를 극복하고 있기 때문에 사람들은 항상 그 혼란 한 column == expressionkeyword = 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하여 캐시로 사용할 수있는 것이 중요 합니다 (트랜잭션 관련)


답변