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

Python用pyodbc实现SQL Server内连接Update语句报错求助

解决pyodbc更新SQL Server时的"name 'am' is not defined"错误

嘿,这个问题我之前也踩过坑!你碰到的name 'am' is not defined错误,本质是Python把你SQL语句里的字符串值(比如'am')当成了一个未定义的Python变量,所以才抛出这个报错。

错误的写法(大概率是你现在的代码)

比如你可能写了类似这样的代码:

import pyodbc

conn = pyodbc.connect('你的数据库连接字符串')
cursor = conn.cursor()

# 错误:直接把'am'写进SQL,Python会把am当成变量名
cursor.execute("UPDATE YourTable SET Status = am WHERE ID = 1")
conn.commit()

这里Python看到am,会默认你要引用一个叫am的变量,但你根本没定义过它,自然就报错了。

正确的做法:使用参数化查询

这是pyodbc操作数据库的最佳实践,既避免语法错误,又能彻底防止SQL注入风险。有两种常用的写法:

方式1:使用?作为占位符

import pyodbc

# 建立连接
conn = pyodbc.connect('你的数据库连接字符串')
cursor = conn.cursor()

# 定义要更新的变量
status_value = 'am'
target_id = 1

# 用?占位,把变量作为第二个参数传入execute
cursor.execute("UPDATE YourTable SET Status = ? WHERE ID = ?", (status_value, target_id))
# 一定要提交事务,否则更新不会生效
conn.commit()

# 用完记得关闭资源
cursor.close()
conn.close()

方式2:使用命名参数(参数多的时候更清晰)

import pyodbc

conn = pyodbc.connect('你的数据库连接字符串')
cursor = conn.cursor()

# 用字典存储要更新的参数
update_params = {
    'status': 'am',
    'id': 1
}

# 用:参数名作为占位符,传入字典
cursor.execute("UPDATE YourTable SET Status = :status WHERE ID = :id", update_params)
conn.commit()

cursor.close()
conn.close()

几个关键提醒

  • 必须调用conn.commit():pyodbc默认是手动提交事务的,不执行这一步的话,你的更新操作只会停留在内存里,不会真正写入数据库。
  • 绝对不要直接拼接字符串构造SQL:比如f"UPDATE ... SET Status = '{status_value}'",这种写法不仅容易因为值里的特殊字符(比如单引号)触发语法错误,还会给SQL注入留后门,非常不安全。

内容的提问来源于stack exchange,提问作者user7416279

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:22:39