pyodbc报错:SQL含1个参数标记,却传入2个参数
问题:pyodbc参数不匹配报错排查
我运行以下代码时遇到参数不匹配的报错,试了好几种方法都解决不了,麻烦帮我看看哪里错了?
我的Python代码
tmp = '''SELECT JSON_QUERY(formdata, '$."?-container"') from Disclosures where disclosureid = ?''' print(tmp) print ([itemType, disclosureID]) db.execute(tmp, itemType, disclosureID) return db.fetchone()[0]
代码执行时的打印输出:
SELECT JSON_QUERY(formdata, '$."?-container"') from Disclosures where disclosureid = ? ['gift', 1]
报错信息
pyodbc.ProgrammingError: ('The SQL contains 1 parameter markers, but 2 parameters were supplied', 'HY000')
表结构DDL
CREATE TABLE [dbo].[Disclosures]( [disclosureid] [int] IDENTITY(1,1) NOT NULL, [orgid] [int] NOT NULL, [userid] [int] NOT NULL, [formdata] [nvarchar](max) NOT NULL, [retain] [bit] NULL, [reportsassigned] [bit] NULL, CONSTRAINT [PK__Disclosu__F6B145D3D95E8196] PRIMARY KEY CLUSTERED ( [disclosureid] ASC) );
问题原因&解决方法
核心问题
你误以为'$."?-container"'里的?是参数占位符,但实际上pyodbc只会识别**SQL语句中独立的?**作为参数占位符——字符串常量里的?会被当成普通字符,不会被解析成参数位。所以你的SQL语句里实际只有1个参数(where disclosureid = ?里的那个),但你传了2个参数,导致不匹配报错。
解决方法
方法一:参数化JSON路径(推荐,更安全)
先把itemType拼接成完整的JSON路径字符串,再把路径作为参数传入SQL:
# 构造带itemType的JSON路径 json_path = f'$."{itemType}-container"' # 把JSON路径设为参数占位符 tmp = '''SELECT JSON_QUERY(formdata, ?) from Disclosures where disclosureid = ?''' # 传入路径和disclosureID两个参数 db.execute(tmp, json_path, disclosureID) return db.fetchone()[0]
方法二:直接拼接SQL语句(注意安全)
如果itemType是内部可控的值(不是用户输入),可以直接把路径拼到SQL里:
# 直接拼接JSON路径到SQL语句中 tmp = f'''SELECT JSON_QUERY(formdata, '$."{itemType}-container"') from Disclosures where disclosureid = ?''' # 只需要传入disclosureID一个参数 db.execute(tmp, disclosureID) return db.fetchone()[0]
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

