MySQLdb Python 插入 %d 和 %s。

31

前置条件:

MySQL Table created via:
CREATE TABLE table(Id INT PRIMARY KEY NOT NULL, Param1 VARCHAR(50))

功能:

.execute("INSERT INTO table VALUES(%d,%s)", (int(id), string)

输出:

TypeError: %d format: a number is required, not a str

我不确定发生了什么,也不知道为什么无法执行该命令。这是在Python中使用MySQLdb时发生的情况,.execute 是在游标对象上执行的。

编辑:

这个问题:Python MySQLdb issues (TypeError: %d format: a number is required, not str)说你必须在所有字段中使用%s。为什么会这样?为什么这个命令有效?

.execute("INSERT INTO table VALUES(%s,%s)", (int(id), string)

1
你缺少了一个 %) - .execute("INSERT INTO table VALUES(%d,%s)"% (int(id), string)) - Hussain
4个回答

57

在执行查询时,整个查询需要处于字符串格式,因此应使用%s...

执行查询后,整数值将被保留。

因此,你的代码应该是这样的。

.execute("INSERT INTO table VALUES(%s,%s)", (int(id), string))

链接包含解释。


我在Python 2.7上遇到了类似的语法错误。至少在我的情况下,如果期望一个参数化的%s,我的Python会期望一个字符串值,并且我不得不将其转换为字符串,例如str(someVal)。 - Kickass
@Kickass - 你可能需要检查一下你的SQL INSERT字符串和值元组之间是否使用了字符串插值运算符(%)而不是逗号。 - Bob Kline
@xor 只使用单列,我该怎么做?我的ID是自动递增的,所以不需要添加它。只需要添加字段“Param1”(例如此处)即可。mycursor.execute("INSERT INTO mytable Param1 VALUES %s", (name))。但它一直显示%s语法错误。我也尝试过(%s)。没有用。 - Priya
@Priya 我在这里找到了解决方案:https://dev59.com/mp3ha4cB1Zd3GeqPXKD1 - less

10

格式字符串并不是一个普通的 Python 格式字符串,您必须始终使用 %s 来代替所有字段。


3

我在dev.mysql.com上找到了解决方案。简而言之,在.execute()的第二个参数中使用dict而不是tuple

add_salary = ("INSERT INTO salaries "
              "(emp_no, salary, from_date, to_date) "
              "VALUES (%(emp_no)s, %(salary)s, %(from_date)s, %(to_date)s)")

data_salary = {
  'emp_no': emp_no,
  'salary': 50000,
  'from_date': tomorrow,
  'to_date': date(9999, 1, 1),
}

cursor.execute(add_salary, data_salary)

-4

在字符串格式化中,你漏掉了一个'%'

"(INSERT INTO table VALUES(%d,%s)"%(int(id), string))

1
很抱歉这个回答被踩了,但它是一个前进的方向。你应该编辑它,答案是("INSERT INTO table VALUES(%d,'%s')"%(int(id), string)) - Abr001am
1
最好养成使用cursor.execute函数的参数习惯,以消除注入风险:https://dev59.com/mXRA5IYBdhLWcg3w8SiJ#775399 - TallChuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接