pymysql中的可选WHERE条件执行

时间:2018-04-06 08:06:22

标签: python mysql sql-injection pymysql

我有一个mysql SELECT查询我想用python使用pymysql执行。 为避免重复,我希望该方法采用一些可选参数来定义SELECT是否应将它们用作WHERE条件。

最小例子:

def select_from_db(arg1 = None, arg2 = None):
    db_connection = connect_to_db()
    cursor = db_connection.cursor()
    where_condition_one = ' and arg1 = %s'.format(arg1) if arg1 else ''
    where_condition_two = ' and arg2 = %s'.format(arg2) if arg2 else ''
    cursor.execute('SELECT * FROM tableName WHERE 1=1 ',(where_condition_one, where_condition_two)) 
    #Handle result...

问题是调用select_from_db()的结果查询是:

SELECT * FROM tableName WHERE 1=1 '' ''

虽然我希望它是:

SELECT * FROM tableName WHERE 1=1

我尝试使用None代替'',但后来我得到了:

SELECT * FROM tableName WHERE 1=1 None None

有没有任何优雅的方式我可以通过一个执行语句实现我的目标,而不会让自己开放sql注入?

1 个答案:

答案 0 :(得分:3)

sql = 'SELECT * FROM tableName WHERE 1=1 '
args = []
if arg1:
    sql += ' and arg1 = %s'
    args.append(arg1)
if arg2:
    sql += ' and arg2 = %s'
    args.append(arg2)
cursor.execute(sql, args)

或减少重复:

sql = ['SELECT * FROM tableName WHERE 1=1']
args = []

def add_arg(name, value):
    if value:
        sql.append('and {} = %s'.format(name))
        args.append(value)

add_arg('arg1', arg1)
add_arg('arg2', arg2)

cursor.execute(' '.join(sql), args)