使用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
相关产品推荐
相关产品推荐

