Python - «KeyError: System.Object» - Pyadomd - Запрос источника данных SSAS [решено] - PullRequest
0 голосов
/ 26 мая 2020

Работаю над проектом, в котором я пытаюсь запросить имеющийся у нас источник данных SSAS через Python. В настоящее время соединение находится в файлах 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

Создал этот словарь ключей: значения: См. Словарь здесь

Содержит эти ключи: System.Boolean, System.DateTime, System.Decimal, System.Double, System.Int64, System.String. Я решил, что «KeyError: System.Object» относится к этому словарю. Моя проблема в том, как мне импортировать этот ключ System.Object в этот словарь? Из какой библиотеки / модуля / железа Python Ссылка на Clr я могу получить его?

Что я пробовал:

clr.AddReference("System.Object")

Выдало мне сообщение об ошибке: «Невозможно найти сборку» 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 Iron Python вещь, которую мне не хватает, но я везде искал и не могу ее найти.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Рад, что новая версия решила проблему.

Несколько комментариев к приведенному выше фрагменту кода. Это можно сделать немного более кратким ? Pyadomd импортирует необходимые классы из AdomdClient, что означает, что следующие строки можно не указывать.

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

Ваш код будет выглядеть следующим образом:

import pandas as pd
from sys import path
path.append(r'C:\Program Files (x86)\MicrosoftOffice\root\vfs\ProgramFilesX86\Microsoft.NET\ADOMD.NET\130')

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])

Самое главное - добавить AdomdClient.dll в ваш путь до импорта пакета pyadomd.

Более того, пакет в основном предназначен для использования с CPython версиями 3.6 и 3.7.

0 голосов
/ 26 мая 2020

Что ж, большие проблемы требуют серьезных решений ..

После бесконечных поисков в сети я выбрал 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])

и бац! 10795 строк на 39 столбцов DataFrame, я еще точно не рассчитал время, но пока выглядит хорошо, учитывая объем данных.

...