蟒蛇 - "KeyError : System.Object" - Pyadomd - 查询 SSAS 数据源



正在处理一个项目,我正在尝试通过Python查询我们工作的SSAS数据源。该连接目前在 Excel 文件中,但我正在尝试使用 Python 对该过程进行逆向工程,以自动化我每天所做的部分分析......我使用 pyadomd 库连接到数据源,这是我的代码:

clr.AddReference(r"C:Program Files (x86)Microsoft  OfficerootvfsProgramFilesX86Microsoft.NETADOMD.NET130Microsoft.AnalysisServices.AdomdClient.dll")
clr.AddReference('Microsoft.AnalysisServices.AdomdClient')
from Microsoft.AnalysisServices.AdomdClient import AdomdConnection , AdomdDataAdapter
from sys import path
path.append('C:Program Files (x86)Microsoft OfficerootvfsProgramFilesX86Microsoft.NETADOMD.NET130Microsoft.AnalysisServices.AdomdClient.dll')
import pyadomd
from pyadomd import Pyadomd
from pyadomd._type_code import adomd_type_map, convert
constr= "connection string"
with Pyadomd(constr) as conn:
with conn.cursor().execute(query) as cur:
print(cur.fetchall())

这(部分(有效,似乎我能够连接到 SSAS 数据源。假设我做 conn = Pyadomd(constr(,它没有返回错误(不再像以前那样(。问题是当我尝试使用光标执行查询时,它会返回一个错误,指出:

File "C:UsersUserAnaconda3libsite-packagespyadomdpyadomd.py", line 71, in execute
adomd_type_map[self._reader.GetFieldType(i).ToString()].type_name
KeyError: 'System.Object'

通过做一些研究,我发现KeyError意味着代码试图访问字典中不存在该键的键。通过挖掘我的变量并浏览代码,我意识到以下行:

from pyadomd._type_code import adomd_type_map

创建了这个键:值字典: 在此处查看字典

包含以下键:System.Boolean、System.DateTime、System.Decimal、System.Double、System.Int64、System.String。我认为"KeyError:System.Object"指的是该字典。我的问题是如何将此System.Object键导入该字典?我可以从哪个库/模块/IronPython Clr 参考中获取它?

我尝试过:

clr.AddReference("System.Object")

给我错误消息,指出"找不到程序集'系统.对象'。at Python.Runtime.CLRModule.AddReference(String name(">

我也试过:

from System import Object #no error but didn't work
from System import System.Object #error saying invalid syntax

我认为这与一些 clr 有关。添加参考 IronPython 的东西,我错过了,但我一直在到处寻找,找不到它。

谢谢!

很高兴新版本解决了这个问题。

对上面代码片段的一些注释。可以做得更简洁😊一点 Pyadomd 将从 AdomdClient 导入必要的类,这意味着可以省略以下行。

clr.AddReference(r"C:Program Files (x86)MicrosoftOfficerootvfsProgramFilesX86Microsoft.NETADOMD.NET130Microsoft.AnalysisServices.AdomdClient.dll")
clr.AddReference('Microsoft.AnalysisServices.AdomdClient')
from Microsoft.AnalysisServices.AdomdClient import AdomdConnection , AdomdDataAdapter

然后,您的代码将如下所示:

import pandas as pd
from sys import path
path.append(r'C:Program Files (x86)MicrosoftOfficerootvfsProgramFilesX86Microsoft.NETADOMD.NET130')
from pyadomd import Pyadomd
constr= "constring"
query = "query"
with Pyadomd(constr) as con:
with con.cursor().execute(query) as cur:
DF = pd.DataFrame(cur.fetchone(), columns = [i.name for i in cur.description])

最重要的是在导入 pyadomd 包之前将AdomdClient.dll 添加到您的路径中。

此外,该软件包主要用于CPython版本3.6和3.7。

大问题需要大解决方案。

在网上无休止地搜索后,我继续 https://pypi.org/project/pyadomd/,直接联系了包的作者(SCOUT(。通过电子邮件向他发送了相同的问题,显然代码中存在一个错误,他在一夜之间修复并生成了新版本的软件包,从 0.0.5 到 0.0.6。用他的话说:

[嗨,

谢谢你给我写信 😊

我调查了错误,你是对的,类型映射不支持转换系统对象。

这是一个错误!

我已经将新版本的 Pyadomd 包上传到 Pypi,它应该可以修复这个错误——Pyadomd 现在只需将 System.Object 类型作为 .net 对象传递。由于 Pyadomd 在运行时不知道 System.Object 类型的细节,因此如有必要,您将负责转换为 python 类型。

请使用 pip 安装新版本。1

所以在运行了一个小点安装 pyadomd --upgrade 后,我重新启动了 Spyder 并重试了代码,它现在可以工作了,我可以查询我的 SSAS 立方体!所以希望它可以帮助其他人。

代码片段:

import pandas as pd
import clr
clr.AddReference(r"C:Program Files (x86)MicrosoftOfficerootvfsProgramFilesX86Microsoft.NETADOMD.NET130Microsoft.AnalysisServices.AdomdClient.dll")
clr.AddReference('Microsoft.AnalysisServices.AdomdClient')
from Microsoft.AnalysisServices.AdomdClient import AdomdConnection , AdomdDataAdapter
from sys import path
path.append(r'C:Program Files (x86)MicrosoftOfficerootvfsProgramFilesX86Microsoft.NETADOMD.NET130Microsoft.AnalysisServices.Ado mdClient.dll')
import pyadomd
from pyadomd import Pyadomd
constr= "constring"
query = "query"

然后如他的套餐网站上所示:

with Pyadomd(constr) as con:
with con.cursor().execute(query) as cur:
DF = pd.DataFrame(cur.fetchone(), columns = [i.name for i in cur.description])

砰! 10795 行 x 39 列 数据帧,我还没有精确计算时间,但考虑到数据量,到目前为止看起来不错。

最新更新