본문 바로가기

Language/Python

Pypika where절에 동적으로 or 조건 추가하기

MySQL테이블에서 데이터를 조회하는 쿼리를 만들어 실행하고, 그 결과값을 반환하는 함수를 만들고자 한다.

 

조건

 1. 조회하고 싶은 컬럼은 columns로 입력 받되, 입력값이 없으면(*) 모든 컬럼을 조회한다

 2. data_idx로 데이터를 조회해오며, 키워드가 있을 수도, 없을 수도 있다.

 

2번 조건때문에 고민을 했던 지라 이렇게 글을 남긴다.

 

코드

from pypika import Table, EmptyCriterion, MySQLQuery as Query

def get_data(data_idxs, keyword_includes=None, keyword_excludes=None, columns=None):

 

    if not data_idxs:

        print('잘못된 입력 (data_idxs 는 필수 입력 사항)')

        raise Exception()

 

    connection_string = 'mysql+pymysql://{}:{}@{}:{}'.format(id, password, ip, port) #각 서버 정보 입력

    engine = create_engine(connection_string)

    conn = engine.connect()

 

    my_table = Table('table_name')

    query = Query.from_(my_table)

 

    if columns:

        for column in columns:

            query = query.select(column)  

    else

        query = query.select('*')

 

    criterions = EmptyCriterion()

    if keyword_includes:

            for keyword in keyword_includes:

                criterions |= (my_table.content.like('%{}%'.format(keyword)))

    

    if keyword_excludes:

        for keyword in keyword_excludes:

            criterions |= (my_table.content.not_like('%{}%'.format(keyword)))

    

    if len(criterions.tables_) != 0:

        query = query.where(criterions)

 

    return conn.execute(query)