我有这个函数通过 pymysql 与存储在我的本地主机的 SQL 数据库进行通信。我知道有类似的关于格式化 SQL 部分的帖子,尤其是 this one但有人能提出解决方案吗? 总是收到 TypeError: can't concat tuple to bytes.我想这与 WHERE 子句有关。
def likeMovement(pID):
print("Give a rating for the movement with #id:%s" %pID)
rate=input("Give from 0-5: ")
userID=str(1)
print(rate,type(rate))
print(pID,type(pID))
print(userID,type(userID))
cursor=con.cursor()
sqlquery='''UDPATE likesartmovement SET likesartmovement.rating=%s WHERE
likesartmovement.artisticID=? AND likesartmovement.userID=?''' % (rate,),
(pID,userID)
cursor.execute(sqlquery)
TypeError: not all arguments converted during string formatting
提前致谢!
最佳答案
问题是您将 (pID,userID)
存储为存储在 sqlquery
中的元组的一部分,而不是将它们作为参数传递给 执行
:
sqlquery='''UDPATE likesartmovement SET likesartmovement.rating=%s WHERE
likesartmovement.artisticID=? AND likesartmovement.userID=?''' % (rate,)
cursor.execute(sqlquery, (pID,userID))
<小时/>
如果您举一个更简单的示例,可能会更清楚地了解为什么它们不同:
s = 'abc'
spam(s, 2)
s = 'abc', 2
spam(s)
显然这两个人做的不是同一件事。
<小时/>当我们这样做时:
- 您必须正确拼写
UPDATE
。 - 您通常希望对
SET
子句使用查询参数,其原因与您对WHERE
子句使用查询参数的原因完全相同。 - 您不需要在单表操作中包含表名称,并且不允许在单表操作的
SET
子句中包含表名称表更新。
所以:
sqlquery='''UDPATE likesartmovement SET rating=? WHERE
artisticID=? AND userID=?'''
cursor.execute(sqlquery, (rating, pID, userID))
关于Python 格式化 SQL WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50807088/