SQL“LIKE”문에 해당하는 SQLAlchemy


85

태그 열에는 '사과 바나나 오렌지'및 '딸기 바나나 레몬'과 같은 값이 있습니다. SQLAlchemy에 해당하는 문을 찾고 싶습니다.

SELECT * FROM table WHERE tags LIKE "%banana%";

Class.query.filter()이 작업을 수행 하려면 무엇을 전달해야 합니까?

답변:


172

각 열에는 like()에서 사용할 수있는 메서드가 있습니다 query.filter(). 검색 문자열이 주어지면 %양쪽에 문자를 추가하여 양방향에서 하위 문자열로 검색합니다.

tag = request.form["tag"]
search = "%{}%".format(tag)
posts = Post.query.filter(Post.tags.like(search)).all()

1
완전한! 선행 공백을 추가하는 것보다 사과와 파인애플을 구별하는 더 좋은 방법이 있는지 알고 있습니까?
Gary Oldfaber 2010

3
가장 좋은 방법은 데이터베이스를 정규화하고 태그 및 태그 대 작업 관계에 대해 2 개의 별도 테이블을 추가 한 다음 LIKE 대신 JOIN을 사용하는 것입니다. 그렇지 않으면 예, 문자열의 각 태그 주위에 일종의 구분 기호가 있어야 할 것 같습니다. % pen %가있는 펜과 연필도 있기 때문에 선행 공백은 충분하지 않습니다. "| apple | pineapple | pen | pencil |"과 같이하면 "% | pen | %"와 일치하면 충돌하지 않아야합니다.
Daniel Kluev 2010

1
정규화를 사용하면 주어진 작업과 관련된 두 개 이상의 태그가 있는지 또는 그 반대의 경우 태그 맵을 사용하는지 잘 모르겠습니다. "Toxi"솔루션은 태그 모음을 개별적으로 저장하는 대신 단일 항목으로 그룹화하는 것처럼 보입니다. 그리고이 ( elixir.ematia.de/trac/wiki/Recipes/TagCloud ) 레시피에 사용 된 방법 은 항목 당 하나의 태그 만 허용하는 것으로 보입니다. 이 주제를 설명하는 데 가장 적합한 리소스는 무엇입니까? 이 글 ( dev.mysql.com/tech-resources/articles/… )도 읽었 지만 여러 태그를 관리하는 방법을 설명 할 수 없습니다.
Gary Oldfaber 2010

2
내가 말했듯이 두 개의 테이블이 필요합니다. 기본적으로, 그것의 단지 전형적인 다 대다 관계는, 당신은 그것을 SQLAlchemy의 가이드를 따를 수 있도록 : sqlalchemy.org/docs/... 당신은있을 것이다 tags당신이 태그 이름 등의 태그 정보를 저장하는 테이블을, 당신은해야합니다 task_tags, 표를하는 작업에 추가 된 각 태그에 대해 하나의 레코드가 있습니다. 따라서 태그가 2 개인 작업은 task_tags테이블에 2 개의 레코드 만 있습니다 .
Daniel Kluev 2010

11

위의 답변에 추가하여 솔루션을 찾는 사람은 '좋아요'대신 '일치'연산자를 사용해 볼 수도 있습니다. 편향되고 싶지는 않지만 Postgresql에서 완벽하게 작동했습니다.

Note.query.filter(Note.message.match("%somestr%")).all()

CONTAINSMATCH 와 같은 데이터베이스 함수를 상속합니다 . 그러나 SQLite에서는 사용할 수 없습니다.

자세한 내용은 일반 필터 연산자 로 이동하십시오.


8
이 두 연산자의 차이점은 무엇입니까?
buhtz

@buhtz은 DB 백엔드 참조 SQL-연금술 문서에 따라 달라집니다 docs.sqlalchemy.org/en/14/core/... 당신이 얻을 포스트 그레스에서 to_tsquery당신과 같은 것들에 대한 텍스트 연산자를 추가 할 수있는 ORAND postgresql.org/docs/current/...
Nick

7

이 코드를 시도

output = dbsession.query(<model_class>).filter(<model_calss>.email.ilike('%' + < email > + '%'))


0

네이티브 SQL을 사용하는 경우 내 코드를 참조하고 그렇지 않으면 내 대답을 무시할 수 있습니다.

SELECT * FROM table WHERE tags LIKE "%banana%";
from sqlalchemy import text

bar_tags = "banana"

# '%' attention to spaces
query_sql = """SELECT * FROM table WHERE tags LIKE '%' :bar_tags '%'"""

# db is sqlalchemy session object
tags_res_list = db.execute(text(query_sql), {"bar_tags": bar_tags}).fetchall()

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.