70

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

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)

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

" 文件 "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py",第 151 行,在执行查询 = 查询 % db.literal(args)

类型错误:%d 格式:需要一个数字,而不是 str"

4

6 回答 6

170

格式字符串并不是真正的普通 Python 格式字符串。您必须始终%s用于所有字段。

参考官方文档

如果 args 是列表或元组,则 %s 可以用作查询中的占位符。如果 args 是 dict,则 %(name)s 可以用作查询中的占位符。

-> 即:这里%s不是formatter,而是一个占位符

于 2011-04-26T02:03:56.660 回答
1

我得到了同样的错误,但原因不同。问题是字符串包含一个 '%' 并且混淆了 Python:

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

Python 将 "% discount" 解释为 "%d" 并一直抱怨,因为我输入的是字符串 ('abc'),而不是数字。

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

(解决方法是输入 %% 而不是 %。)

于 2019-03-13T00:14:11.270 回答
0

尝试这个 :

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)
                    )
于 2013-08-12T14:19:52.963 回答
0

基于这个答案https://stackoverflow.com/a/46517683/1564659

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

于 2021-11-09T13:18:09.887 回答
-1

每当你看到这种类型的错误时,应该使用 type() 函数来检查值或变量的类型......,并且会看到 type is - 'str'。意味着 python 获取字符串中的所有值(默认数据类型是字符串)。这就是为什么错误说 %d 是针对数字的,而不是针对字符串的。因此,请在 python 中为每种类型的字段考虑 %s 。

于 2018-10-03T18:38:41.967 回答
-1

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

于 2017-01-21T10:36:47.510 回答