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 版。
在一个项目中,我试图通过 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 版。