You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pyodbc更新Azure SQL表中指定ID的整行数据(传递变量)

使用pyodbc更新Azure SQL表中指定ID的整行数据(传递变量)

嘿,你这明显是把INSERT和UPDATE的语法搞混啦!UPDATE语句根本不需要VALUES子句,这就是代码报错的核心原因。咱们来一步步修正:

首先得理清UPDATE的正确语法逻辑:它是用来修改已有行的,得用SET逐个指定要更新的列和对应值,再通过WHERE定位到目标行。另外还要注意,pyodbc的execute方法只接受一组参数,不能像你那样拆成两个元组传递,得把所有参数合并成一个序列。

下面是修正后的完整函数代码:

def update_invoice(fullName, invoiceNo, date, address, description, total, invoiceID):
    # 正确的UPDATE语句:用SET指定列与占位符,WHERE定位目标行
    update_query = """
        UPDATE dbo.customerInvoices 
        SET customerName = ?, 
            invoiceNo = ?, 
            invoiceDate = ?, 
            customerAddress = ?, 
            invoiceDescription = ?, 
            invoiceTotal = ?
        WHERE id = ?
    """
    # 所有参数合并成一个元组,顺序要和SQL里的占位符完全对应
    params = (fullName, invoiceNo, date, address, description, total, invoiceID)
    cursor.execute(update_query, params)
    cnxn.commit()

给你拆解几个关键点:

  • 替换VALUES为SET:UPDATE是修改已有数据,必须明确指定每个列要更新成什么值,不能用INSERT的VALUES写法
  • 参数统一传递:所有?对应的参数要放在同一个元组里,前6个对应SET里的列,最后一个对应WHERE里的id,顺序绝对不能错
  • 代码可读性优化:把SQL用多行字符串写,结构更清晰,后续维护也方便

最后再给你提两个小建议:

  • 可以用cursor.rowcount获取被影响的行数,比如print(f"成功更新{cursor.rowcount}行"),能快速确认更新是否生效
  • 确保invoiceID对应的行确实存在,不然这条语句不会报错,但也不会有任何行被修改

备注:内容来源于stack exchange,提问作者Bradley Coupland

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 11:47:32