python2.7 - python 如何執行mysql單個參數過濾
問題描述
使用python執行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 單個參數
問題解答
回答1:因為題主并未提及連接數據庫用的哪個庫,所以假設你使用的是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參數為一個可選的序列或者映射,即args參數的期望類型是list或者tuple。那么回頭再看一下你給的輸入參數:
>>> 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
這里就涉及到一個小細節。當創建只有一個元素的元組時,需要加一個逗號,否則解釋器會當作一個字符串創建。
回答2:cursor.execute(’select * from tb where name='%s'’,name)
相關文章:
1. java - 請問在main方法中寫成對象名.屬性()并賦值,與直接參參數賦值輸錯誤是什么原因?2. MySQL數據庫中文亂碼的原因3. docker不顯示端口映射呢?4. android studio總是在processes running好久5. macos - mac下docker如何設置代理6. 關docker hub上有些鏡像的tag被標記““This image has vulnerabilities””7. docker - 各位電腦上有多少個容器啊?容器一多,自己都搞混了,咋辦呢?8. mysql - 新浪微博中的關注功能是如何設計表結構的?9. docker-compose 為何找不到配置文件?10. docker gitlab 如何git clone?
