Python: вставка двойных или одинарных кавычек вокруг строки

Я использую python для доступа к базе данных MySQL, и я получаю неизвестный столбец в поле из-за отсутствия кавычек вокруг переменной.

код ниже:

cur = x.cnx.cursor()
cur.execute('insert into tempPDBcode (PDBcode) values (%s);' % (s)) 
rows = cur.fetchall()

Как вручную вставить двойные или одинарные кавычки вокруг значения s? Я пытался использовать str() и вручную объединять кавычки вокруг s, но это все равно не работает. Оператор sql отлично работает, если дважды и трижды проверить мой запрос sql.


person Jessy    schedule 13.03.2010    source источник


Ответы (3)


Вы не должны использовать строковые функции Python для построения оператора SQL. Вы рискуете оставить уязвимость SQL-инъекции. Вместо этого вы должны сделать это:

cur.execute('insert into tempPDBcode (PDBcode) values (%s);', s) 

Обратите внимание на запятую.

person Mark Byers    schedule 13.03.2010

Python сделает это за вас автоматически, если вы используете API базы данных:

cur = x.cnx.cursor()
cur.execute('insert into tempPDBcode (PDBcode) values (%s)',s) 

Использование DB API означает, что python выяснит, использовать кавычки или нет, а также означает, что вам не нужно беспокоиться об атаках с внедрением SQL, если ваша переменная s содержит, скажем,

value'); drop database; '
person Ian Clelland    schedule 13.03.2010

Если бы это был чисто вопрос обработки строк, ответом было бы просто поместить их в строку:

cur.execute('insert into tempPDBcode (PDBcode) values ("%s");' % (s)) 

Это классический вариант использования, почему Python поддерживает оба вида кавычек.

Однако, как указывалось в других ответах и ​​комментариях, в этом случае есть проблемы, связанные с SQL.

person Vicki Laidler    schedule 13.03.2010
comment
Хотя в SQL строки заключаются в одинарные кавычки, поэтому одинарные и двойные кавычки следует поменять местами. - person Ian Clelland; 13.03.2010
comment
@Ian - спасибо, не знал этого о SQL. Явно не правильно понял! Я отредактировал соответственно. - person Vicki Laidler; 13.03.2010
comment
если вы заботитесь о значках SO, я считаю, что, удалив этот ответ с -3, вы в конечном итоге получите значок давления сверстников. - person tzot; 12.04.2010