带参数的 PypyODBC:[ODBC Microsoft Access 驱动程序] 参数太少。预期 3(不是日期问题)
Posted
技术标签:
【中文标题】带参数的 PypyODBC:[ODBC Microsoft Access 驱动程序] 参数太少。预期 3(不是日期问题)【英文标题】:PypyODBC with parameters: [ODBC Microsoft Access Driver] Too few parameters. Expected 3 (not a Date issue) 【发布时间】:2019-05-08 13:55:30 【问题描述】:我正在设置基于 Flask 的小型 RestFul API 以访问数据库。 我已经解决了 GET 和 POST 方法,这些方法效果很好,但 PUT 有问题。
我已经将 pyodbc 换成了 pypyodbc,因为它实际上有“更新”方法。我在 10.0.17134.1 上运行它(尝试过 14.00.7010.1000 较旧)ODBC 32 位驱动程序和 Windows 10 机器上的 32 位 python 3.7.2。
def put(self, code_id):
query = request.get_json()[0]
sql = 'UPDATE `employees` SET `employee`=?, `access_level`=? WHERE `CODE`="' + code_id+ '";'
params = [query['Employee'], query['Access level']]
cursor.execute(sql, params)
return Response(status=200)
我收到下一个错误:
pypyodbc.DatabaseError: ('07002', '[07002] [ODBC Microsoft Access Driver] Too few parameters. Expected 3
我尝试只发送一个参数来更改单个字段,但稍加改动后仍会出现相同的错误 - 它希望您改为发送 2 个参数。如果您在“参数”列表中添加一个额外的参数,那么您将得到
pypyodbc.ProgrammingError: ('HY000', 'The SQL contains 2 parameter markers, but 3 parameters were supplied')
错误。
另外,DB 中的列名和表名是俄语(我翻译的),不能更改。因此查询时需要加引号。
PS。 INSERT 和 SELECT 查询运行良好。
【问题讨论】:
据我所知,在 Access SQL 中,表字段名称不应该用引号括起来,如果需要,可以是方括号:sql = 'UPDATE [employees] SET [employee]=?, [access_level]=? WHERE [CODE]="' + code_id+ '";'. BTW, is
CODE` 一个字符串? `
@marlan 只是尝试将引号交换到括号无济于事,仍然得到同样的错误。 CODE 是一个字符串,是的。我从 json 中获取它作为字符串,但是如果没有我放在那里的额外引号,它就不起作用,给我“数据类型不匹配”错误。
第一个错误来自 Access,第二个来自 ODBC。二是没有发送sql来访问。保留第一个选项的代码,并修改其中的SQL。
关于SQL中的错误,这个错误通常是ACE不能匹配字段名到实际字段(因此把它们当作没有值的参数名)。看看this对你有没有帮助
遗憾的是它没有帮助。所有字段名称都应该匹配,因为我使用基本相同的参数进行了 INSERT 查询。我只是没有尝试声明 WHERE 子句。
【参考方案1】:
好的,我终于明白了。
所以,显然WHERE
子句需要单引号 (') 而不是双引号 (")。
当参数包含在其中时,它就像一个魅力。
【讨论】:
以上是关于带参数的 PypyODBC:[ODBC Microsoft Access 驱动程序] 参数太少。预期 3(不是日期问题)的主要内容,如果未能解决你的问题,请参考以下文章
使用 Access ODBC 创建带有 DECIMAL 列的表
错误 - 多级文件夹内的 pypyodbc.win_create_mdb