比較演算子を文字列として関数に渡すだけです。
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')