python2.7 - python 如何執(zhí)行mysql單個參數(shù)過濾
問題描述
使用python執(zhí)行mysql,報錯了:
name = 'AAA’A'cursor.execute(’select * from tb where name=%s’,name)cursor.execute(’select * from tb where name=%s’,(name))
都會報錯
query = query % tuple([db.literal(item) for item in args])TypeError: not all arguments converted during string formatting
但是以下不會報錯:
name = 'AAA’A'cursor.execute(’select * from tb where name=%s and %s’,(name,1))
python27 如何過濾mysql 單個參數(shù)
問題解答
回答1:因為題主并未提及連接數(shù)據(jù)庫用的哪個庫,所以假設(shè)你使用的是mysqldb。可以看一下mysqldb的源碼:
...def execute(self, query, args=None): ''' ... args -- optional sequence or mapping, parameters to use with query. ... ''' if args is not None:# 首先判斷args是否為字典類型if isinstance(args, dict): # 以k-v形式填入查詢語句中。 query = query % dict((key, db.literal(item)) for key, item in args.iteritems())# 當args為非字典類型時else: # 遍歷args, 最后生成一個元組填入查詢語句中。 query = query % tuple([db.literal(item) for item in args]) ...
可以看到,args參數(shù)為一個可選的序列或者映射,即args參數(shù)的期望類型是list或者tuple。那么回頭再看一下你給的輸入?yún)?shù):
>>> name = ’test’>>> type(name)<type ’str’>>>> type((name))<type ’str’>>>> type((’name’, 1))<type ’tuple’>
所以,解決方法很簡單:
>>> type((name, ))<type ’tuple’>>>> cursor.execute(’select * from tb where name=%s’,(name, ))1L
這里就涉及到一個小細節(jié)。當創(chuàng)建只有一個元素的元組時,需要加一個逗號,否則解釋器會當作一個字符串創(chuàng)建。
回答2:cursor.execute(’select * from tb where name='%s'’,name)
相關(guān)文章:
1. 數(shù)組按鍵值封裝!2. java - web項目中,用戶登陸信息存儲在session中好 還是cookie中好,取決于什么?3. angular.js - webpack build后的angularjs路由跳轉(zhuǎn)問題4. mysql - 大部分數(shù)據(jù)沒有行溢出的text字段是否需要拆表5. mysql federated引擎無法開啟6. mysql 新增用戶 主機名設(shè)定 失敗7. 單擊登錄按鈕無反應(yīng)8. ubuntu - mysql 連接問題9. mysql - 查詢字段做了索引為什么不起效,還有查詢一個月的時候數(shù)據(jù)都是全部出來的,如果分拆3次的話就沒問題,為什么呢。10. mysql儲存json錯誤
