带参数的 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(不是日期问题)的主要内容,如果未能解决你的问题,请参考以下文章

带参数的 ASP.NET ODBC 查询

使用 Access ODBC 创建带有 DECIMAL 列的表

odbc_execute 参数不起作用(空警告)

错误 - 多级文件夹内的 pypyodbc.win_create_mdb

pypyodbc 从 python 在 netezza 数据库中创建存储过程的错误

无法使用 pypyodbc 在 python 中使用 where 子句运行 mssql 选择查询