2016-07-07 33 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注入響應。查看[bobby tables](http://bobby-tables.com/python.html)瞭解如何防止python中的SQL注入,因爲SQL注入是一場噩夢。 –

+0

非常感謝,我現在明白了。 –

1

在Python不能連接這樣做的字符串

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

這就是你想要做的。相反,你必須做"Foo bar" + a + " baz " + b。但是,如果你使用%s,您使用的格式(基於C的printf功能),你可以使用逗號以這種方式

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

感謝您的幫助,我看到我的問題是。 –