Python - "KeyError : System.Object" - Pyadomd - Querying a SSAS Data Source

Python - "KeyError : System.Object" - Pyadomd - Querying a SSAS Data Source

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

clr.AddReference(r"C:\Program Files (x86)\Microsoft  Office\root\vfs\ProgramFilesX86\Microsoft.NET\ADOMD.NET0\Microsoft.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 Office\root\vfs\ProgramFilesX86\Microsoft.NET\ADOMD.NET0\Microsoft.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),它 returns 没有错误(不再像以前那样)。问题是当我尝试使用游标执行查询时 returns 出现错误提示:

  File "C:\Users\User\Anaconda3\lib\site-packages\pyadomd\pyadomd.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

创建了 keys:values 的字典: See dictionary here

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

我尝试了什么:

clr.AddReference("System.Object")

给我错误消息 "Unable to find assembly '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.AddReference 铁 Python 东西有关,但我到处找都找不到。

谢谢!

大问题需要大解决方案..

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

[嗨,

谢谢你给我写信

查错了,你是对的,类型映射不支持转换System.Object。

这是一个错误!

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

请使用pip安装新版本。]1

所以在 运行 一点 pip install pyadomd --upgrade 之后,我重新启动了 Spyder 并重试了代码,它现在可以工作了,我可以查询我的 SSAS 多维数据集了!!所以希望它可以帮助别人。

代码片段:

import pandas as pd
import clr
clr.AddReference(r"C:\Program Files (x86)\MicrosoftOffice\root\vfs\ProgramFilesX86\Microsoft.NET\ADOMD.NET0\Microsoft.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)\MicrosoftOffice\root\vfs\ProgramFilesX86\Microsoft.NET\ADOMD.NET0\Microsoft.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 列 DataFrame,我还没有精确计算时间,但考虑到数据量,到目前为止看起来不错。

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

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

clr.AddReference(r"C:\Program Files (x86)\MicrosoftOffice\root\vfs\ProgramFilesX86\Microsoft.NET\ADOMD.NET0\Microsoft.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)\MicrosoftOffice\root\vfs\ProgramFilesX86\Microsoft.NET\ADOMD.NET0')

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 版。