대소 문자를 구분하지 않는 Flask-SQLAlchemy 쿼리


96

사용자 데이터베이스에서 쿼리하기 위해 Flask-SQLAlchemy를 사용하고 있습니다. 그러나

user = models.User.query.filter_by(username="ganye").first()

돌아올 것이다

<User u'ganye'>

하기

user = models.User.query.filter_by(username="GANYE").first()

보고

None

대소 문자를 구분하지 않는 방식으로 데이터베이스를 쿼리하는 방법이 있는지 궁금합니다. 두 번째 예제는 여전히

<User u'ganye'>

답변:


193

필터에서 lower또는 upper함수를 사용하여 수행 할 수 있습니다 .

from sqlalchemy import func
user = models.User.query.filter(func.lower(User.username) == func.lower("GaNyE")).first()

또 다른 옵션은 다음을 사용하여 검색하는 ilike것입니다 like.

.query.filter(Model.column.ilike("ganye"))

3
filter_by사용자 이름 열이 인덱싱 되는 방법에 비해 쿼리 속도가 느려질 까요?
CaptainDaVinci

13

@plaes의 답변을 개선하면 필요한 열만 지정하면 쿼리가 더 짧아집니다.

user = models.User.query.with_entities(models.User.username).\
filter(models.User.username.ilike("%ganye%")).all()

위의 예제는 AJAX 목적으로 Flask의 jsonify를 사용하고 자바 스크립트에서 data.result를 사용하여 액세스해야하는 경우 매우 유용합니다 .

from flask import jsonify
jsonify(result=user)

@ VedranŠego 참조 주셔서 감사합니다. 나는 또한 내 자신의 테스트를 수행 할 것입니다.
iChux

3

넌 할 수있어

user = db.session.query(User).filter_by(func.lower(User.username)==func.lower("GANYE")).first()

또는 ilike 기능을 사용할 수 있습니다.

 user = db.session.query(User).filter_by(User.username.ilike("%ganye%")).first()

비율을하지 말았어야 두 번째 옵션
액 스웰
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.