正在一个项目中,我正在尝试通过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东西有关,但是我一直到处寻找并且找不到它。
谢谢!
大问题需要大解决方案。
[经过无休止的搜索之后,我继续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,我还没有精确计算时间,但是到目前为止,考虑到数据量,它看起来还不错。