Python构建SQL UPDATE语句时遇‘Bad operand type for unary +: str’错误求助
解决Python中"Bad operand type for unary +: str"错误的SQL拼接问题
咱们一步步拆解你的问题,先把报错的根源理清楚:
错误原因分析
整数与字符串直接拼接(第二个代码示例)
Python不允许直接把整数(比如21)和字符串(比如"integration =")用+拼接——两种类型不兼容,必须把整数转换成字符串才能和其他字符串拼接。这也是第一个示例用str(21)的原因,但第一个示例还有其他语法问题(后面细说)。错误的续行写法(第四个代码示例)
你在第四个代码里写了'14' \+ ", quality =",这里的\+是完全错误的:- 反斜杠
\在Python里是用来续行的,正确的续行应该把\放在行尾,而不是加号前面。 - 写成
\+后,Python会把这个加号当成一元加号运算符(就是用来表示正数的+,比如+5),但一元加号不能作用在字符串上,所以直接触发了Bad operand type for unary +: str错误。
- 反斜杠
SQL语句的语法问题(所有示例都存在)
你的SQL字符串里缺少必要的空格:SET后面没有空格,会变成SETintegration,SQL引擎根本无法识别。communication =17后面直接接WHERE,会变成communication =17WHERE,同样是无效语法。
正确的写法推荐
最简洁且不容易出错的方式是使用Python的f-string(Python 3.6及以上版本支持),它能自动处理类型转换和字符串拼接,还能让代码可读性大幅提升:
update1 = f'''UPDATE User_Answer_Knowledge SET integration = {21}, scope = {12}, schedule = {13}, cost = {14}, quality = {15}, resource = {16}, communication = {17} WHERE User_Key = 1'''
如果你的Python版本较低,也可以用str()转换整数后拼接,但一定要注意空格和正确的续行方式:
update1 = '''UPDATE User_Answer_Knowledge SET ''' + \ "integration =" + str(21) + ", " + \ "scope =" + str(12) + ", " + \ "schedule =" + str(13) + ", " + \ "cost =" + str(14) + ", " + \ "quality =" + str(15) + ", " + \ "resource =" + str(16) + ", " + \ "communication =" + str(17) + \ " WHERE User_Key = 1"
注意这里的续行是把\放在每一行的末尾,同时在WHERE前面加了空格,避免SQL语法错误。
额外提醒:SQL注入风险
虽然你的示例里用的是固定值,但如果以后要动态传入用户输入的内容,绝对不要用字符串拼接的方式生成SQL语句,会有严重的SQL注入风险。应该用数据库驱动提供的参数化查询,比如:
# 以MySQL为例(使用pymysql) cursor.execute( '''UPDATE User_Answer_Knowledge SET integration = %s, scope = %s, schedule = %s, cost = %s, quality = %s, resource = %s, communication = %s WHERE User_Key = %s''', (21, 12, 13, 14, 15, 16, 17, 1) )
这样既安全又能避免类型转换的麻烦。
内容的提问来源于stack exchange,提问作者Feng Xiong
相关产品推荐
相关产品推荐

