Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌套if与循环Python中的one if_Python_Sql_Nested If - Fatal编程技术网

嵌套if与循环Python中的one if

嵌套if与循环Python中的one if,python,sql,nested-if,Python,Sql,Nested If,我正在尝试动态构建包含边界约束的有效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) firststatme

我正在尝试动态构建包含边界约束的有效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
附言:
有没有一些简单的方法来构建只包含硬编码键边界的SQL,比如
r['prefined']
,如果
r={'prefined':'someValue','sapmKey':'spamvalue'}
,那么垃圾值就不会被插入到查询中了?

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

您可以使用以下代码执行此操作:

constraints = ' AND '.join('{} = {}'.format(*t) for t in r.items())
sql = 'SELECT * FROM table WHERE {}'.format(constraints)
但这是不安全的:如果密钥或值包含例如反引号,黑客可能会试图导出您的数据库

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

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查询(当然,考虑到库本身是安全的)。这通常会对应用程序的安全性产生积极影响


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

是的,但构建这样的查询不是一个好主意。至少,您需要在格式块的第二个条目中使用
。这样你就不会有SQL注入的风险。你可能会减少代码行的数量,但是你会让阅读和理解变得更加困难。谢谢你,这正是我想要的