2016-08-30 13 views
0

Это работает, когда я заменяю переменную столбца фактическим именем столбца. Однако мне нужна переменная. Когда я использую переменную, я получаю синтаксическую ошибку MySQL. Может ли поле быть переменной? Если да, то где ошибка?Использование переменной в качестве имени поля в MySQLdb, Python 2.7

conn = self.create_connection() 
     cur = conn[0] 
     db = conn[1] 

     cur.execute(''' 
         UPDATE coefficients 

         SET %s = %s 
         WHERE coef_id = %s 

        ''' , (sql_col_name, fgi, ici)) 
     db.commit() 

Ok вот отслеживающий:

  raise errorclass, errorvalue 
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''base_rpm' = 3500 WHERE coef_id = 460' at line 1") 
+0

Я не использовал MySQLdb, но я использовал psycopg2 с базой данных Redshift и использовал переменные в инструкции sql там, вам нужно определить строку sql и передать строку sql команде execute. Пример: 'SQL = "Коэффициенты обновления SET% S% S = Где coef_id =% s"' ' cur.execute (SQL)' Если он не был определен таким образом буквальным '% s 'был передан в запрос. – Bob

+1

Я не буду публиковать как ответ, поскольку я чувствую себя некомфортно, делая это сам в SQLite (я чувствую, что это взломанно, и, возможно, я получу слишком, если кто-то скажет мне, что я ошибаюсь ...), но вы можете сформировать запрос отдельно например 'query =" UPDATE something SET {} =% s ".format ('hello')', а затем 'print query% 'goodbye''. В этом случае использование 'format' не влияет на'% s' в вашей предварительно сформированной строке, поэтому вы создаете ее в двух частях. – roganjosh

+0

Я не могу отредактировать свой предыдущий комментарий, но, конечно, чтобы получить переменные в строке, вам понадобится что-то подобное в вашем заявлении sql. 'sql =" Обновить коэффициенты SET {1} = {2} WHERE coef_id = {3} ". Format (sql_col_name, fgi, ici)' Или любые методы форматирования, которые вы предпочитаете, до тех пор, пока вы добавляете их в Струна. – Bob

ответ

2

Проблемы есть в том, что замена параметров в методе execute предназначена для использования только для данных - как вы выяснили. Это не совсем явное в documentation, но это то, как большинство драйверов базы данных реализуют его.

Важно отметить намерение подстановки параметров в execute и executemany методов для форматирования объектов Python в качестве строк в базу данных, и применить побег и кавычки, так что инъекции SQL становится трудно (если не невозможно) без нужно беспокоиться о нескольких местах, где можно было уйти.

Что необходимо, когда вам нужно использовать имена переменных столбцов (или изменять другие части оператора SQL), является форматирование строки с использованием методов форматирования строк Python - и оставить полученную строку подходящим способом для использования в качестве подходящий параметр для подстановки данных, во второй подстановке (так что вождение ключа и кавычки все еще выполняется драйвером).

Чтобы избежать необходимости избежать %s записи для самых параметров, можно использовать другой метод интерполяции строк, чем оператор %, например, более новый метод format строки:

cur.execute(''' 
        UPDATE coefficients 
        SET {} = %s 
        WHERE coef_id = %s 

       '''.format(sql_col_name) , 
       (fgi, ici)) 

Этот пример показывает простейший способ, с помощью которого ваш пример будет работать - просто напишите его в коде, чтобы он был легко читаемым и настраиваемым - например, с использованием дополнительной переменной для оператора и вызовом format до строки, вызывающей execute. Но это только стиль.

+1

Upvote, спасибо за подтверждение моего подхода в комментариях. Это было источником дискомфорта в течение довольно долгого времени, но, как вы говорите, это не явное в документации :) – roganjosh

+0

Отлично! Спасибо всем за вашу помощь. –

 Смежные вопросы

  • Нет связанных вопросов^_^