我有一个最近从 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' 选项并且光标不使用描述属性时,一切正常。