Python 格式化 SQL WHERE 子句

标签 python mysql formatting

我有这个函数通过 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/

相关文章:

mysql - SQL 查询在两个不同的 Mysql AWS 服务器中的工作方式不同

mysql - 非识别或识别

php - 带有图像列表的子表的 MySQL 父表我可以将子表作为父表中的数组吗?

python - dump() 缺少 1 个必需的位置参数 : 'fp' in python json

java - 如何打印格式化的 BigDecimal 值?

python - 符合当今标准的 Python 字符串格式

python - 如何在 Python 中控制 string.format(bool_value) 结果的长度?

python - python 中的 a=[1] 和 [1] 有什么区别?

python - 对两个列表进行排序——一个是列表的列表

python - 两个fft函数的卷积