Строковая интерполяция, вызывающая ошибки MysqlDB - PullRequest
1 голос
/ 26 марта 2011

Я пытаюсь использовать mysqlDB, но столкнулся с проблемой, которая вообще не имеет для меня смысла.

Моя проблема сосредоточена вокруг имени таблицы в следующих инструкциях execute.

Это работает:

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 Ответ

4 голосов
/ 26 марта 2011

Если под «интерполяцией строк» ​​вы подразумеваете форматирование строк в Python, это НЕ то, что вы используете. cursor.execute() выполняет вставку параметра SQL, который имеет собственный набор правил. Путаница возникает из-за того, что некоторые интерфейсы базы данных (включая mysqlDB) используют %s в качестве заполнителя ... другие интерфейсы базы данных используют, например, ?

Когда вы используете параметризованный SQL, заполнители могут появляться только там, где выражение может появляться в SQL. Имя таблицы не является выражением. Когда ваш аргумент является строкой, он заключен в одинарные кавычки, поэтому в результирующем SQL он выглядит как строковый литерал SQL. Это включает удвоение одинарных кавычек, например, то, что в Python будет выглядеть как строковый литерал, такой как "O'Brien", становится 'O''Brien' в SQL.

Итак, вы не можете помешать ему заключить в кавычки одинаковые символы. Вам нужно сделать два шага: (1) построить строку SQL, которая вставит AIN0, где вы хотите, используя форматирование строки Python. (2) Используйте эту строку SQL в вашем cursor.execute()

...