Попытка использовать параметризованный оператор MySQL SELECT в Python

avatar
b.etter
8 августа 2021 в 23:08
29
0
0

Я относительно новичок в Python и MySQL и пытаюсь построить запрос, который будет нацелен на указанную таблицу, столбец и значение. Я смог заставить его работать, сшив вместе строки и входные данные функции, но поиграл с параметрами (%s), чтобы посмотреть, смогу ли я выполнить ту же задачу более красивым способом — возможно ли это?

Ниже показана рабочая итерация моей (упрощенной) функции:

def getRowbyString(a_table, a_col1, a_string):

  q = ("SELECT * FROM " + a_table + " WHERE " + "LOWER(" + a_col1 + ")" + " = '" + a_string + "'")

  qr = db.Cursor.execute(q)

  results = []

  for row in qr:
    results.append(row)
  
  return results

Когда я обновляю оператор select и курсор для использования параметров a la:

q = "SELECT * FROM %s WHERE LOWER(%s) = %s"

dbCursor.execute(q, (a_table, a_col1, a_string))

Меня встречает следующее:
ProgrammingError: 1064 (42000): ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с ''employees' WHERE LOWER('first_name') = 'saniya'' в строке 1.

Основываясь на приведенной выше ошибке, я не думаю это возможно, потому что появляется добавление апострофов к параметрам. Я надеюсь, что у кого-то есть умное решение или кто-то может однозначно сказать мне, что это невозможно сделать.

Источник
danblack
8 августа 2021 в 23:16
1

Параметризацию можно использовать для значений, но не для имени таблицы.

b.etter
8 августа 2021 в 23:23
1

В соответствии с именем таблицы я предполагаю, что столбец, указанный в предложении where, также не учитывается... классные бобы, спасибо! Это то, что я искал.

danblack
9 августа 2021 в 00:59
0

Да, параметризацию нельзя использовать с идентификаторами, только со значениями. Кроме того, если вам нужно сравнение без учета регистра, использование сопоставления без учета регистра (*_ci) для столбца избавит от необходимости использовать LOWER(), что приведет к более быстрым запросам, если столбец проиндексирован. Добро пожаловать в StackOverflow. Продолжайте задавать хорошие вопросы.

Ответы (0)