2017-12-20 6 views
0

사용자의 전자 메일 및 대체 전자 메일 주소가 포함 된 Postgres 테이블에 텍스트 배열 열이 있습니다.대소 문자를 구별하지 않는 배열 쿼리 Flask-SQLAlchemy

나는 Flask와 SQLAlchemy를 사용하고 있으며 사용자가 입력 한 전자 메일이 배열에 들어있는 행에 대해 데이터베이스를 쿼리하려고합니다. 순간 나는 .contains

난 데 문제는 기존의 전자 메일 주소의 일부 그러나 내가 만들기위한 방법을 찾을 수 없습니다 대문자와 소문자의 혼합물을 가지고있다
Users.query.filter(Users.emails.contains({email})).first() 

을 사용하고 있습니다 배열의 아랫쪽이나 대소 문자를 구분하지 않습니다.

func.lower를 살펴 봤지만이 배열은 배열과 잘 작동하고 싶지 않습니다. 다른 옵션은 .ilike이지만 작동하지 않을 수 있으며 내 테이블은 약 10,000 행입니다. ilike 나는 가장 효율적이라고 생각하지 않습니까?

가장 좋은 방법은 무엇입니까?

+0

더러운 해결책은 배열을 텍스트 'lower()'로 캐스팅하고 확인하는 것입니다. 성능은별로 좋지 않습니다. 더 깨끗한 접근법은 좀 더 복잡하지만'unnest()'와 [배열 생성자] (https://www.postgresql.org/docs/current/static/sql-expressions.html#SQL-SYNTAX)를 살펴보십시오. -ARRAY-CONSTRUCTORS). –

답변

-2

난 그냥 원시 SQL을 사용하여 결국 트릭을 한거야.

db.engine.execute("SELECT * FROM Users WHERE '%s' = ANY(lower(emails::text)::text[])" % email) 
+0

솔루션이 작동하지만 -1 문자열을 쿼리에 값을 지정하는 형식입니다. 자리 표시 자/bindparams 사용 : http://docs.sqlalchemy.org/en/latest/core/tutorial.html#using-textual-sql. –

관련 문제