#1-2 프로그램개발/#Python Sample 코드 예제

[python, 문자열 연산] binding Query -> literal Query 변환 함수 만들기

HopeDeveloper 2022. 7. 19. 17:52

# in_query = "Query = SELECT * FROM EMP WHERE EQP_NO = :test1, params = 567"

# 바인딩 쿼리를 입력하여 비인딩 변수 위치를 검색
# 1) 바인딩 start(':') 찾기  -> 2) 바인딩 변수 end 찾기 -> 3) 끝 위치 찾아서 반환
def get_end_index(input_str, start_index) :
    end_list = [" ", ",", "+", "-", "/", "*", "=", "%", ">" , "<"]
    print("test",input_str, start_index)
    # 문자열 for 문으로 출력 -> end 문자 확인하여 길이 리턴
    for i in range(start_index, len(input_str)) : 
        # print("test", i, input_str, len(input_str))
        if input_str in end_list : 
            # msg_log = "index = {0}, char = {1}".format(i, str1[i])
            end_index = i
            return True, end_index
        
        elif i == (len(input_str) -1) : 
            return True, i+1
    return False, 0

# text 문자를 입력받아 query와 params 정보를 불리
def seperate_paramter(input_query):
    input_query = input_query.upper()
    # 1. "query" -> "=" -> "PARAMS" -> between string
    query_index1 = input_query.find("QUERY")
    query_index2 = input_query.find("=", query_index1) + 1
    query_index3 = input_query.find("PARAMS", query_index2)
    tmp_query = input_query[query_index2: query_index3]
    between_index = tmp_query.rfind(",") 
    query_result = tmp_query[:between_index]
    query_result = query_result.strip()
    query_result = query_result.replace("\"", "")

    # 4. "params" 데이터 찾기
    params_index1 = input_query.find("PARAMS")
    params_index2 = input_query.find("=", params_index1) + 1
    params_result = input_query[params_index2:len(input_query)]
    params_result = params_result.strip()

    # logic end
    return query_result, params_result

# Params 변수를 리스트에 저장
def get_parameter_list(input_param) : 
    result_list = input_param.split('|')
    return result_list

# query, 바인딩 변수 리스트로 리터럴 쿼리 생성
def make_literal_query(input_str, binding_list) :
    # try:
        query_result = None
        #1. 바인딩 위치 찾기
        for i in range(len(input_str)) : 
            print('loop i = {0}, length = {1}'.format(i,len(input_str)))
            if input_str[i] == ":":
                start_index = i
                is_ok, end_index = get_end_index(input_str, start_index)
                
                if is_ok == True : 
                    bind_var = ""
                    if len(binding_list) > 0 : 
                        bind_var = binding_list.pop(0)
                        query_result = input_str[:start_index] + "'" +  str(bind_var) + "'"+ input_str[end_index:]
                        input_str = query_result
                        
                    else : 
                        print("binding count is not correct.")
            if (i+1) >= len(input_str) :
                # print("break", i, len(input_str))
                break;
            # else :
            #     print("continue", i, len(input_str))
        return query_result
    # except Exception as e:
    #     print(e, input_str)



def convert_lieral_query(query) : 
    literal_query = None
    
    #1. query, parameter 분리
    bind_query, bind_para = seperate_paramter(query)
    print("[Step1]", bind_query + "\n", bind_para)
        
    #2. parameter를 리스트로 저장
    bind_list = get_parameter_list(bind_para)
    print("[Step2]", bind_list)
    
    #3. query와 바인드 리스트를 이용하여 리터럴 쿼리 생성
    literal_query = make_literal_query(bind_query, bind_list)
    print("[Step3]", literal_query)
    
    return literal_query


convert_lieral_query(in_query)
# print(convert_lieral_query(str1))