您的位置:首页 > 编程语言 > Python开发

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

2017-05-21 17:03 423 查看
【问题描述】

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)
既添加绿色的部分,就能解决这个问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐