Необязательные условия WHERE в pymysql выполняются

0

У меня есть запрос 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?

  • 2
    Для динамического построения запросов также есть sqlalchemy.org .
  • 0
    Спасибо, я пытаюсь избежать ORM, поскольку я хочу контролировать точный SQL, который я создаю :)
Показать ещё 2 комментария
Теги:
sql-injection
pymysql

1 ответ

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)
  • 0
    %s отлично работает в pymysql. Я проверял ? тоже но не работает.
  • 0
    @ user8212173 спасибо
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню