嵌套 if vs 一个 if 在循环 Python

nested if vs one if in loop Python

我正在尝试动态构建有效的 SQL 语句,包括边界约束。我的问题是有没有什么简单的方法可以像下面这样使用 for 循环构建有效的 SQL 语句?

sql = 'SELECT * from table '
firststatment = True
r = dict(request.query)
for k,v in r.items():
    if firststatment:
        sql = sql + ' where {} = {}'.format(k,v)
        firststatment = False
    else:
        sql = sql + ' and {} = {}'.format(k,v)

或者在这种情况下最好使用像

这样的结构
if bondarydate1 and bondarydate2:
    sql = sql + ' where year(date) between ({} and {})'.format(bondarydate1, bondarydate2)
    marker = True
elif bondarydate1:
    sql = sql + ' where year(date) = {}'.format(bondarydate1)
    marker = True
elif bondarydate2:
    sql = sql + ' where year(date) = {}'.format(bondarydate2)
    marker =True

if marker and boundaryparam2:
    sql = sql + ' and boundaryparam2 = {}'.format(boundaryparam2)
elif boundaryparam2:
    sql = sql + ' where boundaryparam2 = {}'.format(boundaryparam2)
    marker = True

if marker and boundaryparam3:
    sql = sql+' and boundaryparam3 = {}'.format(boundaryparam3)
elif boundaryparam3:
    sql = sql + ' where boundaryparam3 = {}'.format(boundaryparam3)
    marker = True

if marker and boundaryparam4:
    sql = sql + ' and boundaryparam4 = {}'.format(boundaryparam4)
elif boundaryparam4:
    sql = sql + ' where boundaryparam4 = {}'.format(boundaryparam4)
    marker = True

if marker and boundaryparam5:
    sql = sql + ' and boundaryparam5 = {}'.format(boundaryparam5)
elif boundaryparam5:
    sql = sql +' where boundaryparam5 = {}'.format(boundaryparam5)

基本上我正在尝试以某种方式丰富有效的 SQL 语句,如下所示

SELECT * from x where date between bondarydate1 and boundarydate2  and column1 = dhkjf and column2 = 343

P.S: 是否有一些简短的方法来构建 SQL,它只包含 r['predefined'] 和 if r = {'predefined':'someValue', 'sapmKey':'spamvalue'} 等硬编码键的边界,这样垃圾邮件值就不会插入查询中?

,但构建这样的查询不是一个好主意:它很容易允许 SQL 注入

您可以使用以下代码完成:

constraints = ' AND '.join('{} = {}'.format(*t) for t in r.items())
sql = 'SELECT * FROM table WHERE {}'.format(constraints)

但这并不安全:如果键或值包含例如反引号,黑客可能会导出您的数据库。

我建议至少转义这些值(通常 - 希望 - 用户只能控制这些值),然后你可以使用像 %s 这样的占位符,并让像 My[= 这样的库30=]db 转义值。例如:

constraints = ' AND '.join('{} = %s'.format(k) for k in r.keys())
sql = 'SELECT * FROM table WHERE {}'.format(constraints)
cursor.execute(sql, r.values())

此外,存在许多 Python 库(如 SQLAlchemy),人们可以在其中安全地构建 SQL 查询(当然,考虑到库本身是安全的)。这通常会对您的应用程序的安全性产生积极影响。

因此,我强烈建议您使用某种库来与数据库对话。通常它会提供一个很好的额外抽象级别,而且它通常会保护您免受大多数安全漏洞的侵害。