Условно добавьте предложение WHERE в Python для cx_Oracle - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть следующий Python код:

    params = {}
    query = 'SELECT * FROM LOGS '
    if(date_from and date_to):
        query += ' WHERE LOG_DATE BETWEEN TO_DATE(:date_start, "MM-DD-YYYY") AND LOG_DATE <= TO_DATE(:date_end, "MM-DD-YYYY")'
        params['date_start'] = date_from
        params['date_end'] = date_to
    if(structure):
        query += ' AND STRUCTURE=:structure_val'
        params['structure_val'] = structure
    if(status):
        query += ' AND STATUS =:status'
        params['status'] = status

    cursor.execute(query, params)

Здесь я условно добавляю к запросу предложение WHERE. Но есть проблема, когда у меня нет значения для дат, так как он не будет принимать WHERE и добавит AND без WHERE. Если я добавлю предложение where к запросу, если фильтра нет, то он выдаст неправильный запрос. Есть ли лучший способ сделать это? Некоторое время я использовал Laravel, и в построителе запросов есть метод when, который поможет добавить условные предложения where. Что-нибудь подобное в Python для cx_Oracle?

1 Ответ

2 голосов
/ 21 февраля 2020
params = {}
query = 'SELECT * FROM LOGS '
query_conditions = []

if(date_from and date_to):
    query_conditions.apend(' WHERE LOG_DATE BETWEEN TO_DATE(:date_start, "MM-DD-YYYY") AND LOG_DATE <= TO_DATE(:date_end, "MM-DD-YYYY")')
    params['date_start'] = date_from
    params['date_end'] = date_to
if(structure):
    query_conditions.append('STRUCTURE=:structure_val')
    params['structure_val'] = structure
if(status):
     query_conditions.append('STATUS =:status')
    params['status'] = status
if query_conditions:
    query += " AND ".join(query_conditions)

cursor.execute(query, params)

добавить их в list и объединить значения с AND

...