[在cx_Oracle中有条件地在Python中添加WHERE子句

问题描述 投票:0回答:1

我有以下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的任何内容?

python flask cx-oracle
1个回答
1
投票
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合并

© www.soinside.com 2019 - 2024. All rights reserved.