python - 可以在 Python API 中参数化查询名称变量吗?
问题描述
以下 API 函数有效。但我想参数化查询名称,这样我就不必使用 if...else。相反,我希望能够从查询 url 中获取参数,将其连接到查询名称变量并执行查询。
我希望能够粘贴“ qry_
+ <reportId>
”并将其用作查询名称变量,如qry_R01
,qry_R02
或qry_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
解决方案
在这种情况下,您似乎需要从表映射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 注入攻击的风险。更好的解决方案是使用准备好的语句,但执行此操作的确切代码取决于所使用的数据库驱动程序。