You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Python3.6+Flask+pyodbc连接SQL Server时参数匹配错误求助

解决pyodbc参数标记不匹配的错误

嘿,这个错误我太熟悉了!你遇到的pyodbc.ProgrammingError: ('The SQL contains 0 parameter markers, but 3 parameters were supplied', 'HY000'),本质问题就是你的SQL查询语句里没有使用pyodbc要求的参数占位符,但你却传入了3个参数——数据库根本不知道该把这些参数放到SQL的哪个位置,自然就报错了。

关键知识点:pyodbc的参数占位符是?

和Python里很多数据库库用%s或者命名占位符(比如:username)不同,pyodbc对接SQL Server的参数化查询必须用?作为占位符,每个?对应一个你要传入的参数。

错误示例 vs 正确示例

假设你原本的代码是这样的(错误写法):

# 错误:SQL里没有参数占位符,直接写死或者用了错误的标记
sql = "INSERT INTO users (username, email, password) VALUES ('张三', 'zhangsan@example.com', '123456')"
cursor.execute(sql, (username, email, hashed_password))  # 传了3个参数,但SQL里没地方放

改成正确的参数化写法就解决了:

# 正确:用?作为占位符,数量和参数一致
sql = "INSERT INTO users (username, email, password) VALUES (?, ?, ?)"
cursor.execute(sql, (username, email, hashed_password))  # 3个?对应3个参数,完美匹配

额外注意事项

  • 绝对不要手动拼接SQL字符串:比如sql = f"INSERT INTO users VALUES ('{username}', '{email}')",这种写法会带来严重的SQL注入风险,参数化查询才是安全的做法。
  • 参数数量必须严格匹配:SQL里有几个?,你就要传几个参数,多一个少一个都会触发类似的错误。
  • 确保你的连接配置完整:比如你代码里的conn = pyodbc.con...要补全正确的连接字符串,示例如下:
conn = pyodbc.connect(
    'DRIVER={ODBC Driver 17 for SQL Server};'
    'SERVER=你的服务器名;'
    'DATABASE=你的数据库名;'
    'UID=用户名;'
    'PWD=密码;'
)
cursor = conn.cursor()

按照这个思路修改你的查询语句,应该就能解决这个错误啦!

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

火山引擎 最新活动