当前位置: 首页 > 后端技术 > Python

pymysql正确处理转义字符

时间:2023-03-26 13:15:11 Python

鏂规涓€锛氫娇鐢?s鍗犱綅绗﹁繖涔熸槸瀹樻柟鎺ㄨ崘鐨勬柟妗堛€備紭鐐癸細涓嶉渶瑕佸叧娉ㄦ槸鍚﹀姞寮曞彿鐨勯棶棰橈紙瀛楃涓茬被鍨嬭嚜鍔ㄥ姞寮曞彿锛屽甫寮曞彿鐨凬umeric绫诲瀷涓嶅姞寮曞彿锛夊彲浠ヨ嚜鍔ㄨ浆涔変笉鍚岀被鍨嬬殑鍙傛暟锛堟暟瀛椼€佸瓧绗︿覆銆佸瓧鑺傜瓑锛?"鑷姩寮曠敤瀛楃涓茬被鍨嬶紝涓嶅紩鐢ㄦ暟瀛楃被鍨?锛屽姞寮曞彿鐨勬搷浣滄槸python璇█鐨勭壒鐐癸紝浣嗘槸pymysql甯垜浠鐞嗕簡銆傛湁涓€涓ず渚嬩唬鐮佹潵瑙i噴锛歩mportpymysql.cursors#杩炴帴鍒版暟鎹簱connection=pymysql.connect(host='localhost',user='user',password='passwd',database='db',cursorclass=pymysql.cursors.DictCursor)withconnection:withconnection.cursor()ascursor:sql="SELECT`id`,`password`FROM`users`WHERE`email`=%s"cursor.execute(sql,('webmaster@python.org',))result=cursor.fetchone()print(result)鍏充簬鍗犱綅绗︽牱寮忕殑鏇村淇℃伅锛岃鍙傝€冿細pep249:paramstyle瑙e喅鏂规浜岋細鎵嬪姩璋冪敤escape鏂规硶Placeholders寰堝ソ锛屼絾鏄綋浣犱娇鐢╢-string鍜宖ormat鎷兼帴瀛楃涓诧紝杩樺緱鎵嬪姩澶勭悊杞箟瀛楃鐨勯棶棰橈紒鎴戜滑鍏堢湅涓嬫簮鐮侊紝鐪嬬湅cursor.execute鍚庨潰鐨勫弬鏁皃arameters鍋氫簡浠€涔堝鐞嗭紒馃憞璋冪敤execute鏂规硶鏃讹紝浼氫娇鐢╩ogrify澶勭悊鍙傛暟args銆俶ogrify璋锋瓕缈昏瘧鐨勭粨鏋滄槸锛歶pgradepymysql/cursors.pydefexecute(self,query,args=None):"""Executeaquery:paramstrquery:Querytoexecute.:paramargs:parametersusedwithquery.(鍙€?:typeargs:tuple,listordict:return:Numberofaffectedrows:rtype:int濡傛灉args鏄垪琛ㄦ垨鍏冪粍锛?s鍙互鐢ㄤ綔鏌ヨ涓殑鍗犱綅绗︺€傚鏋渁rgs鏄瓧鍏革紝%(name)s鍙互浣滀负鏌ヨ涓殑鍗犱綅绗︺€?""whileself.nextset():passquery=self.mogrify(query,args)result=self._query(query)self._executed=queryreturnresult馃憞璋冪敤mogrify鏂规硶鏃讹紝浼氫娇鐢╛escape_args鏉ュ鐞嗗弬鏁癮rgs銆傛垜浠彧璁ㄨifisinstance(args,(tuple,list))锛氳繖涓潯浠朵篃鏄渶甯哥敤鐨勬柟娉曘€傝繘鍏ヨ繖涓潯浠跺悗锛屼細璋冪敤literal鏂规硶澶勭悊鍚勪釜鍙傛暟pymysql/cursors.pydef_escape_args(self,args,conn):ifisinstance(args,(tuple,list)):returntuple(conn.literal(arg)forarginargs)elifisinstance(args,dict):return{key:conn.literal(val)for(key,val)inargs.items()}else:#濡傛灉瀹冧笉鏄瓧鍏革紝鎴戜滑杩樻槸灏濊瘯杞箟瀹冦€?鏈€鍧忕殑鎯呭喌浼氭姏鍑哄€奸敊璇痳eturnconn.escape(args)defmogrify(self,query,args=None):"""杩斿洖閫氳繃璋冪敤execute()鏂规硶鍙戦€佸埌鏁版嵁搴撶殑纭垏瀛楃涓层€傝繖methodfollowstheextensiontotheDBAPI2.0followedbyPsycopg."""conn=self._get_db()ifargsisnotNone:query=query%self._escape_args(args,conn)returnquery馃憞璋冪敤鏂囧瓧鏂规硶鏃讹紝鍙傛暟arg锛堣繖閲屾敼鍚嶏細obj锛夊皢浣跨敤杞箟鏂规硶杩涜澶勭悊銆備笉鍚岀被鍨嬬殑鍙傛暟鏈変笉鍚岀殑澶勭悊鏂规銆俥scape_string鏂规硶灏嗙敤浜巗tring绫诲瀷锛宔scape_bytes鏂规硶灏嗙敤浜巄yte绫诲瀷锛坃quote_bytes璋冪敤escape_bytes锛夛紝escape_item鏂规硶鐢ㄤ簬鍏朵粬绫诲瀷銆傛墍浠ユ垜浠彲浠ユ牴鎹弬鏁扮被鍨嬫潵閫夋嫨璋冪敤鍝釜鏂规硶鏉ュ鐞嗚浆涔夊瓧绗﹂棶棰樸€備竴鑸潵璇达紝鎴戜滑鍙渶瑕佸叧娉ㄥ瓧绗︿覆鍗冲彲銆傛渶濂界殑鍔炴硶灏辨槸鎴戜滑鐩存帴璋冪敤escape鏂规硶锛岃繖鏍峰氨涓嶇敤鑷繁鍘诲鐞嗘暟鎹被鍨嬮棶棰樹簡锛屼絾鏄痚scape鏂规硶鏄被鏂规硶锛屼笉浼氱洿鎺ユ毚闇茬粰鎴戣皟鐢ㄣ€俥scape_string銆乪scape_bytes鍜宔scape_item鏂规硶鏄痯ymysql/converters.py涓殑鍑芥暟锛屽彲浠ョ洿鎺ヨ皟鐢ㄣ€俻ymysql/connections.pydefescape(self,obj,mapping=None):"""杞箟浣犱紶閫掔粰瀹冪殑浠讳綍鍊笺€傞潪鏍囧噯锛屼緵鍐呴儴浣跨敤锛涗笉瑕佸湪浣犵殑搴旂敤绋嬪簭涓娇鐢ㄥ畠銆?""ifisinstance(obj,str):return"'"+self.escape_string(obj)+"'"ifisinstance(obj,(bytes,bytearray)):ret=self._quote_bytes(obj)ifself._binary_prefix:ret="_binary"+retreturnretreturnconverters.escape_item(obj,self.charset,mapping=mapping)defliteral(self,obj):"""escape()鐨勫埆鍚嶉潪鏍囧噯锛屼緵鍐呴儴浣跨敤锛涗笉瑕佸湪鎮ㄧ殑搴旂敤绋嬪簭涓娇鐢ㄥ畠銆?""returnself.escape(obj,self.encoders)鎵€浠ワ紝褰撴垜浠渶瑕佹墜鍔ㄨ浆涔夌殑鏃跺€欙紝灏卞彲浠ョ洿鎺ヨ皟鐢╡scape鏂规硶銆備粠escape鏂规硶鐨勪唬鐮佸彲浠ョ湅鍑猴紝褰撳弬鏁颁负瀛楃涓叉椂锛?鍓嶅悗浼氬姞鍗曞紩鍙凤紝杩欐槸涓轰簡鍥炵瓟鏂囩珷寮€澶寸殑闂鈥滆嚜鍔ㄧ粰string绫诲瀷鍔犲紩鍙凤紝涓嶆槸tonumerictypes.Quotationmarks"problemifisinstance(obj,str):return"'"+self.escape_string(obj)+"'"馃憞閫氳繃涓嬮潰鐨勪唬鐮侊紝鎴戜滑鍙互浣跨敤闈炲父pythonic鐨刦-string鏉ュ鐞唖ql锛屼絾鏄渶瑕佹敞鎰忕殑闂鏄瘂}闇€瑕佽嚜宸卞姞涓婂寮曞彿銆傜ず渚嬩唬鐮侊細importpymysql.cursorsfrompymysql.convertersimportescape_string#杩炴帴鏁版嵁搴揷onnection=pymysql.connect(host='localhost',user='user',password='passwd',database='db',cursorclass=pymysql.cursors.DictCursor)user=escape_string('webmaster@python.org')password=escape_string('very-secret')withconnection:withconnection.cursor()ascursor:#鍒涘缓涓€鏉℃柊璁板綍sql="INSERTINTO`users`(`email`,`password`)VALUES('{user}','{password}')"娓告爣銆俥xecute(sql)#榛樿鎯呭喌涓嬭繛鎺ヤ笉鏄嚜鍔ㄦ彁浜ょ殑銆傛墍浠ヤ綘蹇呴』鎵胯淇濆瓨#yourchanges.connection.commit()鎵╁睍锛氫娇鐢ㄥ崰浣嶇鍚屾椂鑾峰彇瀹屾暣鐨剆ql璇彞鍋囪浣犳湁濡備笅闇€姹傦細闇€瑕佽幏鍙栧畬鏁寸殑sql璇彞骞惰褰曞湪鏃ュ織涓紝鍚屾椂浣犳兂浣跨敤鍗犱綅绗︽潵澶勭悊杞箟瀛楃锛屼綘涔熷彲浠ョ敤涓婇潰鐨勬柟娉曟潵澶勭悊锛?/p>