我正在尝试动态构建包含边界约束的有效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['predefined']
和ifr = {'predefined':'someValue', 'sapmKey':'spamvalue'}
,这样就不会在查询中插入垃圾邮件值?你知道吗
是的,但是构建这样的查询不是一个好主意:它很容易允许SQL注入。你知道吗
可以使用以下代码执行此操作:
但这是不安全的:如果键或值包含反引号,黑客可能会试图导出您的数据库。你知道吗
我建议至少转义这些值(通常-希望-用户只能控制这些值),然后可以使用
%s
之类的占位符,并让MySQLdb之类的库转义这些值。例如:此外,还有很多Python库(比如SQLAlchemy)可以安全地构造SQL查询(当然,如果库本身是安全的)。这通常会对应用程序的安全性产生积极影响。你知道吗
因此,我强烈建议您使用某种库与数据库进行对话。通常,它会提供一个额外的抽象级别,这很好,而且它通常会保护您免受大多数安全漏洞的攻击。你知道吗
相关问题 更多 >
编程相关推荐