2016-07-07 3 views
1

Я изучаю использование Python с MySQL. Тот же запрос работает по-разному между Mysql и PyMySQL. Например: в консоли MySQL у меня есть таблица под названием «страницы»Недопустимый синтаксис при использовании PyMySQL

INSERT INTO pages (title,content) VALUES ("test title","test content") 

И это работает. В Python я импортирую PyMySQL, создаю соединение, а затем введите cursor = "cur". Когда я запускаю:

cur.execute("INSERT INTO pages (title,content) VALUES ("test title","test content")") 

.. он вызывает ошибку: недействительный синтаксис. Но когда я попробую это с держателем места:

cur.execute("insert into pages (title,content) values (%s,%s)",("test title","test content")) 

Тогда это работает! Поэтому я был смущен, почему тот же запрос работает в MySQL, но не в python, и означает ли это, что я всегда должен использовать держатель места при использовании PyMySQL?

Благодаря

+1

Да, вы должны использовать параметризованные запросы. Однако, если вы посмотрите на заявление, которое не работает, подумайте о том, как вы используете двойные кавычки. Вы в основном закрываете свою строку - вместо этого используйте одинарные кавычки, и она тоже будет работать ... – sgeddes

+0

Да, я вижу, такая ошибка новобранец –

ответ

1

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

Теперь, чтобы ответить на ваш вопрос. Если вы хотите использовать двойные кавычки внутри двойных кавычек, вы должны бежать них:

cur.execute("INSERT INTO pages (title,content) VALUES (\"test title\", \"test content\")") 

Или используйте одинарные кавычки снаружи и двойные кавычки внутри:

cur.execute('INSERT INTO pages (title,content) VALUES ("test title", "test content")') 
+1

+1 Для ответа SQL Injection. Проверьте [bobby tables] (http://bobby-tables.com/python.html), как предотвратить SQL Injection в python, поскольку SQL-инъекция - это кошмар. –

+0

Большое спасибо, я получаю его сейчас. –

1

В питона вы не можете сцепить в этом случае

a = "foo" 
b = "bar" 
"Foo bar" a " baz " b 

Это то, что вы пытались сделать. Вместо этого вы должны сделать "Foo bar" + a + " baz " + b. Однако, если вы используете %s, вы используете форматирование (на основе printf функции C), и вы можете использовать запятые для форматирования строки таким образом

a = "foo" 
b = "bar" 
"Foo bar %s baz %s" % (a, b) 
+0

Спасибо за помощь, я вижу свою проблему. –

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