У меня есть запрос 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-injection?
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)
%s
отлично работает в pymysql. Я проверял ?
тоже но не работает.