Python-“ KeyError:System.Object”-Pyadomd-查询SSAS数据源[已解决]

问题描述 投票:0回答:1

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

clr.AddReference(r"C:\Program Files (x86)\Microsoft  Office\root\vfs\ProgramFilesX86\Microsoft.NET\ADOMD.NET\130\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.NET\130\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),它不返回错误(不再像以前那样返回错误)。问题是当我尝试使用游标执行查询时,它返回一条错误消息:

  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

创建了此键字典:值:See dictionary here

包含这些键:System.Boolean,System.DateTime,System.Decimal,System.Double,System.Int64,System.String。我发现“ KeyError:System.Object”是指该字典。我的问题是如何将这个System.Object键导入到字典中?我可以从哪个库/模块/ IronPython Clr参考中获得它?

我尝试过的事情:

clr.AddReference("System.Object")

向我显示错误消息“无法在Python.Runtime.CLRModule.AddReference(String name)处找到程序集'System.Object'。

我也尝试过:

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

我认为这与我所缺少的clr.AddReference IronPython东西有关,但是我一直到处寻找并且找不到它。

谢谢!

python ssas clr ironpython adomd.net
1个回答
0
投票

大问题需要大解决方案。

[经过无休止的搜索之后,我继续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.NET\130\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.NET\130\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])

和ba! 10795行乘39列DataFrame,我还没有精确计算时间,但是到目前为止,考虑到数据量,它看起来还不错。

© www.soinside.com 2019 - 2024. All rights reserved.