1

我有一个最近从 python 2.7.x 升级到 python 3.6.3 的 web2py API 应用程序。API 函数查询 Microsoft SQL 数据库。

当我使用选项“as_dict=True”执行 SQL 语句时,游标对象使用其描述属性从 db 表中获取列名以进行一些检查,但由于某种原因,从数据库返回的列名是“腐败”。

例如:

数据库表:

webDataTbl:
_key      |      _value

WEB_NAME        NAME
WEB_VER         '1.2.3'

SP:

SELECT * FROM  webDataTbl WHERE _key LIKE 'WEB_%'

web2py中的函数:

sql_cmd = ("EXEC getWebData")
result = db.executesql(sql_cmd, as_dict=True)
return {"result": result}

executesql 方法执行以下代码(当 as_dict=True 时):

columns = adapter.cursor.description
fields = colnames or [f[0] for f in columns]
if len(fields) != len(set(fields))
    raise RuntimeError

源代码所述,当第一个字段是列名(或别名)时,cursor.description 返回一个包含 7 项元组的列表,从数据库返回的每一列对应一个元组。但是,当我打印元组时,我得到了这个:

[(b'c', <class 'str'>, 64, 64, 64, 0, False), (b'c', <class 'str'>, 256, 256, 256, 0, True)]

我认为问题可能是 DB 编码或其他问题,但它无助于更改 sql 连接中的编码。我没有更改我的代码、数据库数据、SP 等中的任何内容。我唯一做的就是升级版本。请注意,获取的数据是好的。当我不使用 'as_dict' 选项并且光标不使用描述属性时,一切正常。

4

1 回答 1

0

我尝试做同样的事情时遇到了完全相同的问题, PY27-> PY38 和 Web2PY 版本更新 2.14-> 2.21 。Web2py 显然有他自己的pyodbc。当我连接时,我没有意识到这一点,直到我看到我没有在系统(FreeBSD)中安装pyodbc。安装后一切正常

何塞

编辑:我在这里试图解释的是,发生错误是因为 Web2py 有(至少我认为)一个过时的 pyodbc 驱动程序。解决方案是安装在系统或 virtualenv pyodbc 中。

于 2021-12-02T17:41:51.547 回答