programing

SQL "LIKE" 문과 동등한 SQL Lchemy

muds 2023. 9. 28. 08:51
반응형

SQL "LIKE" 문과 동등한 SQL Lchemy

태그 열에는 "사과 바나나 오렌지" 및 "딸기 바나나 레몬"과 같은 값이 있습니다.나는 SQLchemy와 동등한 문장을 찾고 싶습니다.

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

무엇을 전달해야 합니까?Class.query.filter()이거 하려고요?

각 열은 다음이 있습니다.like()method, 에서 사용할 수 있는query.filter(). 검색 문자열이 지정된 경우 다음을 추가합니다.%양쪽에서 하위 문자열로 검색할 문자입니다.

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

위의 답변에, 누가 해결책을 찾든지 간에, '좋아요' 대신 '일치' 연산자를 사용해 볼 수도 있습니다.편향되고 싶지 않지만 포스트그레스ql에서 완벽하게 작동했습니다.

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

CONTENS, MATCH 등의 데이터베이스 기능을 이어받습니다.그러나 SQLite에서는 사용할 수 없습니다.

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

다음 코드를 사용해 보십시오.

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

대소문자를 구분하지 않는 like 절 구현을 원하는 경우:

session.query(TableName).filter(TableName.colName.ilike(f'%{search_text}%')).all()

SQLLchemy 1.4/2.0의 경우:

q = session.query(User).filter(User.name.like('e%'))

native 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()

PostgreSQL 사용like(위의 허용된 답변 참조) 케이스는 일치하지만, (케이스가 민감하지 않은) 케이스는 일치합니다.

승인된 답변은 정상적으로 작동하지만, "ORM Query 개체는 SQLAlchemy 2.0의 레거시 구성체입니다"(ref: Legacy Query API - SQLAlchemy 2.0 Documentation).

SQL과 동등한 SQLLchemy v2.0LIKE를 사용한 문장select컨스트럭트는 아래 파이썬 3.10 코드 스니펫과 같습니다.

from typing import List

from sqlalchemy import select
from sqlalchemy.orm import Session

...

def get_multi_like_tag_substring_bidirectional(
    db: Session,
    *,
    tags_search_substring: str,
    skip: int = 0,
    limit: int = 10,
) -> List[Post]:
    return db.scalars(
        select(Post)
        .where(Post.tags.like(f"%{tags_search_substring}%"))
        .offset(skip)
        .limit(limit)
    ).all()

...

banana_tagged_posts = get_multi_like_tag_substring_bidirectional(
    db=db_session,
    tags_search_substring = "banana"
)
    

그동안 내가 사용해왔던 것들:

model = MyModel
col = "name_of_my_column"
value = "your-value"

query = model.query.filter(getattr(model, col).like("%{}%".format(value))).all()

천만에요! ;) 저는 베이베이가 제가 뭘 하는지 모르겠어요 허허

이렇게 하는 것이 네이티브 sql로서 나(Oracle)에게 효과가 있었습니다.

"SELECT * FROM table WHERE tags LIKE '%' || :bar_tags || '%' "

언급URL : https://stackoverflow.com/questions/3325467/sqlalchemy-equivalent-to-sql-like-statement

반응형