Python MySQLdb 问题(TypeError:% d 格式: 需要一个数字,而不是 str)

我正在尝试执行以下插入操作:

cursor.execute("""
insert into tree (id,parent_id,level,description,code,start,end)
values (%d,%d,%d,%s,%s,%f,%f)
""", (1,1,1,'abc','def',1,1)
)

我的 MYSQL 表的结构是:

id int(255),
parent_id int(255),
level int(11),
description varchar(255),
code varchar(255),
start decimal(25,4),
end decimal(25,4)

但是,当我运行我的程序,我得到了错误

执行中的“ File”/usr/lib/pymodule/python2.6/MySQLdb/cursors.py”第151行 Query = query% db.Literal (args)

TypeError:% d 格式: 需要一个数字,而不是 str”

100403 次浏览

格式字符串实际上不是普通的 Python 格式字符串。必须始终对所有字段使用 %s

参阅 正式文件:

如果参数是列表或元组,% 1! 可以在查询中用作 占位符。如果 args 是一个 dict,% (name) s 可以用作查询中的占位符。

- > 就是: 这里 %s非格式化程序,但是 只是个替代品

试试这个:

cursor.execute("""
insert into tree (id,parent_id,level,description,code,start,end)
values (%s,%s,%s,'%s','%s',%s,%s)
"""%(1,1,1,'abc','def',1,1)
)

由于他的数据是整数或十进制格式,如何使用% s,通常用于字符串格式% d 或% i 应该用于整数或十进制值。

每当您看到这种类型的错误时,应该使用 type ()函数来检查值或变量的类型... ,并将看到 type is-‘ str’。意味着 python 接受字符串中的所有值(默认数据类型为 string)。这就是为什么错误说% d 表示数字,而不是字符串。因此,对于每种类型的字段,请考虑 python 中的% s。

我也犯了同样的错误,但原因不同。问题是这个字符串包含一个“%”,这让 Python 感到困惑:

TemplateStr = '[....] % discount rate  [....]  %s and %s
print TemplateStr % ('abc', 'def')

Python 将“% 折扣”解释为“% d”,并且一直在抱怨,因为我向它提供的是字符串(‘ abc’) ,而不是数字。

我花了很长时间才弄明白!

(解决方案是键入%% 而不是% 。)

根据这个答案

我最后使用 %s甚至对于浮点数和数字。当插入到表中并且 SQL 检测到表数据类型时,它将立即被转换