您可以将比较运算符作为字符串传递给您的函数:
query1('2013-01', '<=')
这会将运算符的字符串插入到查询中,从而导致
select *
from table
where number <= 1
and date = 2013-01
请注意,通过插入字符串直接构建 SQL 查询是 SQL 注入的潜在载体。如果您允许用户提供自己的日期字符串,则用户可能会注入一些 SQL 代码并运行恶意代码。查看查询参数化以获取更多信息。
如果您想防范 SQL 注入,您应该执行以下操作。允许的操作员列表被仔细列入白名单,因此只能使用有效且安全的操作员。这用于构建查询。cursor.execute()
然后通过命令将日期注入到查询中。MySQLdb
然后处理从您的数据构建安全查询,并且不允许恶意用户注入他们自己的 SQL 来代替日期字符串。
import MySQLdb
def query1(date, comp):
query = '''
select *
from table
where number {comp} 1
and date = %s
'''.format(comp=sql_comp_operator(comp))
cursor.execute(query, (date, ))
return cursor.fetchall()
def sql_comp_operator(comp):
operators = {
'lt': '<',
'lte': '<',
'gt': '>',
'gte': '>=',
}
if comp in operators:
return operators[comp]
else:
raise ValueError("Unknown comparison operator '{}'".format(comp))
query1('2013-01', 'lte')