解决python查询报%d format: a number is required, not str问题

时间:2022-03-17 21:18:51

文章链接:https://blog.csdn.net/u011878172/article/details/72599120

【问题描述】

1、在一条查询语句中,查询条件既包含了整形又包含了字符串型,执行查询函数后,直接报%d format: a number is required, not str

2、例如 ,如下sql 语句  sql = 'select productid from product where productid = %d and productName = %s'

【实例代码】

#coding=utf-8
import MySQLdb

def createConnection():

try:
        conn = MySQLdb.connect('127.0.0.1', 'root', '000000', 'auto', charset='utf8')
    except Exception as e:
        print e
        return conn
    return conn

def select(sql, fieldValue):
    conn = None
    csor = None
    result = None
    try:
        conn = createConnection()
        csor = conn.cursor()
        csor.execute(sql, fieldValue)
        result = csor.fetchall()
        return result
    except Exception as e:
        print e
    finally:
        closeDatabaseConnectionOrCursor(conn, csor)
    return result

if __name__ == '__main__':

sql = 'select productid from product where productid = %d and productName = %s'
    fieldValue = [int(28), '妈妈钱包']
    result = select(sql, tuple(fieldValue))

执行完这一段代码后,系统会提示  %d format: a number is required, not str

【问题解决】

1、当调试到csor.execute(sql, fieldValue)语句时,选择跳入到,这是断点会进入到MySQLdb第三方模块的cursors.py文件的execute方法里,由于fieldValue参数为元组类型,   断点会进入到 query = query % tuple([db.literal(item) for item in args]),再次选择进入

2、这时断点会进入到MySQLdb第三方模块的connections.py的literal方法中,该方法只有一条语句(return self.escape(o, self.encoders)),在这条语句中断点选择进入

3、这时断点会进入到MySQLdb第三方模块的converts.py文件的Thing2Str方法,导致问题的原因也正是在该方法中,以下是Thing2Str的源码:

def Thing2Str(s, d):
"""Convert something into a string via str()."""
return str(s)
问题是由于代码把参数 s 都转换为了 str类型, 所以导致了把整形转换为了 str类型, 导致执行SQL语句时,系统提示数据类型不正确的错误
4、为了解决这个问题,只需要把Thing2Str方法里的源码修改为如下:

def Thing2Str(s, d):
"""Convert something into a string via str()."""
if type(s) == int:
return int(s)
return str(s)
既添加绿色的部分,就能解决这个问题
---------------------
作者:皮凯
来源:CSDN
原文:https://blog.csdn.net/u011878172/article/details/72599120
版权声明:本文为博主原创文章,转载请附上博文链接!