Строковая интерполяция, приводящая к ошибкам MysqlDB
Я пытаюсь использовать mysqlDB, но я столкнулся с проблемой, которая не имеет смысла для меня вообще.
Моя проблема сосредоточена вокруг имени таблицы в следующих инструкциях выполнения.
Это работает:
c.execute(u'''insert into AIN0 (Date_Info, Raw_Data, Calculation_Formula, Calculated_Data) values (%s, %s, %s, %s)''',
(str(date), int(raw), int(formula), 0.1))
Ни одна из этих работ:
c.execute(u'''insert into %s (Date_Info, Raw_Data, Calculation_Formula, Calculated_Data) values (%s, %s, %s, %s)''',
(str("AIN0"), str(date), int(raw), int(formula), 0.1))
c.execute(u'''insert into 'AIN0' (Date_Info, Raw_Data, Calculation_Formula, Calculated_Data) values (%s, %s, %s, %s)''',
(str(date), int(raw), int(formula), 0.1))
Дело в том, что оба нерабочих результата приводят к одному и тому же сообщению об ошибке:
ProgrammingError: (1064, "у вас есть ошибка в вашем синтаксисе SQL; проверьте правильность синтаксиса в руководстве, соответствующем вашей версии сервера MySQL", чтобы использовать значения, близкие к значениям ''AIN0' (Date_Info, Raw_Data, Calculation_Formula, Calculated_Data) ('2011') в строке 1")
Обратите внимание, что в сообщении об ошибке AIN0 окружен одинарными кавычками, даже в случае, когда я вставил его с помощью оператора интерполяции строки. Просто чтобы быть уверенным, я сделал преднамеренную синтаксическую ошибку в рабочем случае, чтобы увидеть, на что смотрит MySQL.
ProgrammingError: (1064, "у вас есть ошибка в вашем синтаксисе SQL; проверьте правильность синтаксиса, близкого к"), в руководстве, соответствующем вашей версии сервера MySQL "; значения AIN0 (Date_Info, Raw_Data, Calculation_Formula, Calculated_Data) ('201' в строке 1")
Конечно же, в том, с которым MySQL работает правильно, AIN0 не окружен одинарными кавычками, что наводит меня на мысль, что именно это и вызывает ошибку.
Почему одинарные кавычки вставляются вокруг моих строк, когда я использую интерполяцию строк, и как мне их остановить?
1 ответ
Если под "интерполяцией строк" вы подразумеваете форматирование строк в Python, это НЕ то, что вы используете. cursor.execute()
выполняет вставку параметра SQL, который имеет собственный набор правил. Путаница возникает из-за того, что некоторые интерфейсы базы данных (включая mysqlDB) используют %s
в качестве заполнителя... другие интерфейсы базы данных используют, например, ?
Когда вы используете параметризованный SQL, заполнители могут появляться только там, где выражение может появляться в SQL. Имя таблицы не является выражением. Когда ваш аргумент является строкой, он заключен в одинарные кавычки, поэтому в результирующем SQL он выглядит как строковый литерал SQL. Это включает удвоение одинарных кавычек, например, то, что в Python будет выглядеть как строковый литерал, например "O'Brien"
становится 'O''Brien'
в SQL.
Таким образом, вы не можете помешать ему заключить в кавычки одинарные кавычки. Вам нужно сделать два шага: (1) построить строку SQL, которая вставляет AIN0
где вы хотите, используя форматирование строки Python. (2) Используйте эту строку SQL в вашем cursor.execute()