Я относительно новичок в 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.
Основываясь на приведенной выше ошибке, я не думаю это возможно, потому что появляется добавление апострофов к параметрам. Я надеюсь, что у кого-то есть умное решение или кто-то может однозначно сказать мне, что это невозможно сделать.
Параметризацию можно использовать для значений, но не для имени таблицы.
В соответствии с именем таблицы я предполагаю, что столбец, указанный в предложении where, также не учитывается... классные бобы, спасибо! Это то, что я искал.
Да, параметризацию нельзя использовать с идентификаторами, только со значениями. Кроме того, если вам нужно сравнение без учета регистра, использование сопоставления без учета регистра (
*_ci
) для столбца избавит от необходимости использоватьLOWER()
, что приведет к более быстрым запросам, если столбец проиндексирован. Добро пожаловать в StackOverflow. Продолжайте задавать хорошие вопросы.