python操作mysql方法和常見問題
安裝mysql模塊
連接數(shù)據(jù)庫1 #!/usr/bin/env python 2 #coding=utf-8 3 import MySQLdb 4 conn = MySQLdb.connect('localhost','root','rootpass','oj',charset='utf8') 5 cur = conn.cursor() 連接數(shù)據(jù)庫時要注意數(shù)據(jù)庫編碼,不然一堆編碼問題很愁人的~最好統(tǒng)一使用utf8編碼。 執(zhí)行sql語句1 sql_content = "select * from user" 2 cur.execute(sql_content) 3 data = cur.fetchall() 4 for i in data: 5 print i 可以用fetchone來獲取一條結(jié)果。如果是插入數(shù)據(jù),要執(zhí)行commit操作,不然數(shù)據(jù)不會被寫入數(shù)據(jù)庫。最好是執(zhí)行完所有的sql語句之后再commit,實踐證明,這樣會帶來很大的速度提升。 重點講講插入和更新數(shù)據(jù)插入或更新數(shù)據(jù)有兩種方法 1.拼接sql語句: sql_content = "insert into table(key1,key2,key3) values (%s,%s,%s)"%(value1,value2,value3) cur.execute(sql_content) 2.用問號替代 sql_content = "insert into table(key1,key2,key3) values (?,?,?)" cur.execute(sql_content,(value1,value2,value3))
如果value的值存在不確定性,那么上面兩條語句存在sql注入風(fēng)險。 例如,如果value是一段html代碼,html代碼中如果存在引號(但引號或者雙引號),如果不加處理,那么sql語句就將被截斷,將會引發(fā)插入錯誤。 如果value中存在英文逗號,將會造成前面的key和后面的value不對應(yīng),也不能正確插入數(shù)據(jù)。 如果value中存在反斜線\,那么在python中反斜線后面的數(shù)據(jù)將被轉(zhuǎn)義,如果不處理插入的話將會造成字符丟失或者其他不可遇見的結(jié)果。 因為在sql中和在python中有好多含有特殊含義的符號,如果不能很好的處理的話將會出現(xiàn)好多問題,幸好MYSQLdb模塊給我們提供了一個escape_string方法,用這個方法能自動處理好上面的問題,特別方便。 此外,不建議一次插入多個數(shù)據(jù),因為一次插入多個數(shù)據(jù)有可能造成key和value不能對應(yīng),昨天因為這個問題糾結(jié)了一下午。最后將一條sql語句拆成多條語句,也就是一次插入一個value才將問題解決
博主ma6174對本博客文章(除轉(zhuǎn)載的)享有版權(quán),未經(jīng)許可不得用于商業(yè)用途。轉(zhuǎn)載請注明出處http://www.cnblogs.com/ma6174/ 對文章有啥看法或建議,可以評論或發(fā)電子郵件到ma6174@163.com 來自:http://www.cnblogs.com/ma6174/archive/2013/02/21/2920126.html |
|