首页 > 解决方案 > 可以在 Python API 中参数化查询名称变量吗?

问题描述

以下 API 函数有效。但我想参数化查询名称,这样我就不必使用 if...else。相反,我希望能够从查询 url 中获取参数,将其连接到查询名称变量并执行查询。

我希望能够粘贴“ qry_+ <reportId>”并将其用作查询名称变量,如qry_R01,qry_R02qry_R03。可能吗?

def get_report():
    reportId = request.args.get('reportId', '')`

    qry_R01 = """
            SELECT
                column1,
                column2,
                column3,
            FROM
                table1
    """

    qry_R02 = """
            SELECT
                column1,
                column2,
                column3,
            FROM
                table2
    """

    qry_R03 = """
            SELECT
                column1,
                column2,
                column3,
            FROM
                table3
    """

    db = OracleDB('DB_RPT')

    if (rptId == 'R01'):
        db.cursor.execute(qry_R01,
    )

    elif (rptId == 'R02'):
        db.cursor.execute(qry_R02,
    )

    elif (rptId == 'R03'):
        db.cursor.execute(qry_R03,
    )


    json_data = db.render_json_data('json_arr')

    db.connection.close()

    return json_data    

标签: pythonapivariables

解决方案


在这种情况下,您似乎需要从表映射reportId到表,查询的其余部分是相同的。以下解决方案使用字典str.format()

def get_report():
    reportId = request.args.get('reportId', '')

    # this maps ours possible report IDs to their relevant query suffixes
    reportTableMap = {
        'R01': 'table1',
        'R02': 'table2',
        'R03': 'table3',
    }

    # ensure this report ID is valid, else we'll end up with a KeyError later on
    if reportId not in reportTableMap:
        return 'Error: invalid report'
    
    baseQuery = '''
    SELECT
        column1,
        column2,
        column3,
    FROM {table}
    '''

    db = OracleDB('DB_RPT')

    db.cursor.execute(baseQuery.format(table=reportTableMap[reportId]))

    json_data = db.render_json_data('json_arr')

    db.connection.close()

    return json_data
    

但是,此解决方案仅适用于相当简单的情况,并且确实存在打开 SQL 注入攻击的风险。更好的解决方案是使用准备好的语句,但执行此操作的确切代码取决于所使用的数据库驱动程序。


推荐阅读