首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在LINUX上使用Python连接到OLAP立方体

在LINUX上使用Python连接到OLAP立方体
EN

Stack Overflow用户
提问于 2016-08-16 22:59:34
回答 1查看 3.3K关注 0票数 4

我知道如何在Windows上使用Python连接到MS多维数据集--嗯,至少有一种方法:-)。

通常,我使用win32py包并调用.COM对象来连接:

代码语言:javascript
运行
复制
import win32com.client
connection = win32com.client.Dispatch(r'ADODB.Connection')
connString = 'Connection String to MSOLAP CUBE'
connection.Open(connString)

但是,现在我也想对Linux (RHEL7.2)做同样的事情,我不知道该如何做。你能帮我一下吗?

到目前为止我尝试过的:

我尝试使用pyodbc-包或sqlalchemy来建立连接,但没有真正成功地建立连接(参见Edit-1部分)。此外,我甚至不确定我是否在查看正确的包,或者是否有可能连接到Linux :S上的MS多维数据集。

到目前为止我所发现的:

在Windows上,我通常使用.COM对象或.NET框架连接到多维数据集。但是,如果我正确理解,这些都是Windows特有的语言/框架,不能在Linux上使用。现在我正在查看,看看是否可以使用它来建立连接。

更多信息:

Python版本: 3.4 Linux发行版: 7.2 数独在机器上的特权:是的

编辑-1(见: shellter注释)

到目前为止,我尝试了三种不同的方法,但正如上面提到的,我甚至不确定我是否朝着正确的方向工作。我唯一有信心的是,我不能通过.COM对象建立到Cube的连接(就像Windows中的那样),因为Linux不支持.COM环境。

代码-1:

代码语言:javascript
运行
复制
import pyodbc
server = 'server address'
database = 'database name'
connStr = 'Provider=MSOLAP;Data Source=' + server + ';Initial Catalog=' + database + '; Application Name=Python;'
pyodbc.connect(connStr)

错误-1:

代码语言:javascript
运行
复制
File "C:/Users/Desktop/untitled/main.py", line 35, in <module> 
File connStr(connStr)

File TypeError: 'str' object is not callable

代码-2:

代码语言:javascript
运行
复制
import pyodbc

driver = '{MSOLAP}'
server = 'server address’
database = 'database name'
user = ‘user name’
passw = 'password'
connStr = "Provider=MSOLAP;Data Source=" + server + ";Initial Catalog=" + database + "; Application Name=Python;"

错误-2:

代码语言:javascript
运行
复制
File "C:/Users/besechr/Desktop/untitled/main.py", line 19, in <module>
pyodbc.connect('DRIVER=' + driver + ';SERVER=' + server + ';DATABASE=' + database + ';UID=' + user + ';PWD=' + passw)

pyodbc.Error: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')

btw:如果我试图用上面声明的连接字符串(将驱动程序参数更改为{SQL Server})连接到底层SQL服务器,它可以正常工作。

代码-3:

代码语言:javascript
运行
复制
import pyodbc
import sqlalchemy

engine = sqlalchemy.create_engine('mssql+pyodbc://' + server )
engine.connect()

错误-3:

代码语言:javascript
运行
复制
sqlalchemy.exc.DBAPIError: (Error) ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)') None None
EN

回答 1

Stack Overflow用户

发布于 2022-03-31 05:39:12

我也有同样的要求。

我们在Ubuntu 20.04上跑。

尝试1

  • 我们需要Python.Net最新的稳定
  • 这需要Mono作为一种依赖。
  • Mono只支持.NetFW4.xx集成
  • 我们使用了Python.Net的标准安装(这也是.NetFW4.xx支持的)
  • 因此,我们必须使用特定的lib Microsoft.AnalysisServices.AdomdClient.retail.amd64,它只与Windows兼容
  • 如果我们使用microsoft.analysisservices.adomdclient.netcore.retail.amd64,它就会失败,没有错误。
  • 而且,所有的包都必须放在Mono的包存储中。否则它就没能找到他们。

终于失败了,说

代码语言:javascript
运行
复制
EntryPointNotFoundException: GetConsoleWindow assembly:<unknown assembly> type:<unknown type> member:(null)
  at (wrapper managed-to-native) Microsoft.AnalysisServices.AdomdClient.Interop.NativeMethods.GetConsoleWindow()
  at Microsoft.AnalysisServices.AdomdClient.Utilities.WindowsRuntimeHelper.IsProcessWithUserInterface () [0x00018] in <d13c74b6ccb34cf09a1af7bf07e15252>:0 
  at Microsoft.AnalysisServices.AdomdClient.Configuration.ConfigurationHelper.CheckIfProcessWithUserInterface () [0x00009] in <d13c74b6ccb34cf09a1af7bf07e15252>:0 
  at Microsoft.AnalysisServices.AdomdClient.Configuration.RuntimeConfiguration..ctor (System.Collections.Generic.IDictionary`2[TKey,TValue] configuration) [0x0000a] in <d13c74b6ccb34cf09a1af7bf07e15252>:0 
  at Microsoft.AnalysisServices.AdomdClient.Configuration.ConfigurationHelper.EnsureConfigurationIsLoaded () [0x00034] in <d13c74b6ccb34cf09a1af7bf07e15252>:0 
  at Microsoft.AnalysisServices.AdomdClient.Configuration.ConfigurationHelper.get_Connectivity () [0x00000] in <d13c74b6ccb34cf09a1af7bf07e15252>:0 
  at Microsoft.AnalysisServices.AdomdClient.XmlaClient.GetTcpClient (Microsoft.AnalysisServices.AdomdClient.Hosting.IConnectivityOwner owner, Microsoft.AnalysisServices.AdomdClient.ConnectionInfo connectionInfo) [0x000ee] in <d13c74b6ccb34cf09a1af7bf07e15252>:0 
  at Microsoft.AnalysisServices.AdomdClient.XmlaClient.OpenTcpConnection (Microsoft.AnalysisServices.AdomdClient.ConnectionInfo connectionInfo, Microsoft.AnalysisServices.AdomdClient.Sspi.SecurityMode securityMode) [0x00025] in <d13c74b6ccb34cf09a1af7bf07e15252>:0 
  at Microsoft.AnalysisServices.AdomdClient.XmlaClient.OpenConnectionAndCheckIfSessionTokenNeeded (Microsoft.AnalysisServices.AdomdClient.ConnectionInfo connectionInfo) [0x0005a] in <d13c74b6ccb34cf09a1af7bf07e15252>:0 
  at Microsoft.AnalysisServices.AdomdClient.XmlaClient+<>c__DisplayClass95_0.<OpenConnection>b__0 () [0x00000] in <d13c74b6ccb34cf09a1af7bf07e15252>:0 
  at Microsoft.AnalysisServices.AdomdClient.Security.TransparentUserContext.ExecuteInUserContextImpl[TResult] (System.Func`1[TResult] action) [0x00000] in <d13c74b6ccb34cf09a1af7bf07e15252>:0 
  at Microsoft.AnalysisServices.AdomdClient.Security.UserContext.ExecuteInUserContext[TResult] (System.Func`1[TResult] action) [0x00006] in <d13c74b6ccb34cf09a1af7bf07e15252>:0 
  at Microsoft.AnalysisServices.AdomdClient.XmlaClient.OpenConnection (Microsoft.AnalysisServices.AdomdClient.ConnectionInfo connectionInfo, System.Boolean& isSessionTokenNeeded) [0x00020] in <d13c74b6ccb34cf09a1af7bf07e15252>:0 
  at Microsoft.AnalysisServices.AdomdClient.XmlaClient.Connect (Microsoft.AnalysisServices.AdomdClient.ConnectionInfo connectionInfo, System.Boolean beginSession) [0x002c6] in <d13c74b6ccb34cf09a1af7bf07e15252>:0 
  at Microsoft.AnalysisServices.AdomdClient.AdomdConnection+XmlaClientProvider.Connect () [0x00064] in <d13c74b6ccb34cf09a1af7bf07e15252>:0 
  at Microsoft.AnalysisServices.AdomdClient.AdomdConnection+XmlaClientProvider.Microsoft.AnalysisServices.AdomdClient.AdomdConnection.IXmlaClientProviderEx.ConnectXmla () [0x00000] in <d13c74b6ccb34cf09a1af7bf07e15252>:0 
  at Microsoft.AnalysisServices.AdomdClient.AdomdConnection.ConnectToXMLA (System.Boolean createSession, System.Boolean isHTTP) [0x00072] in <d13c74b6ccb34cf09a1af7bf07e15252>:0 
  at Microsoft.AnalysisServices.AdomdClient.AdomdConnection.Open () [0x000b9] in <d13c74b6ccb34cf09a1af7bf07e15252>:0 
  at (wrapper managed-to-native) System.Reflection.RuntimeMethodInfo.InternalInvoke(System.Reflection.RuntimeMethodInfo,object,object[],System.Exception&)
  at System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x0006a] in <533173d24dae460899d2b10975534bb0>:0 

比我聪明的人在这里解释了发生了什么

C# to Mono GetConsoleWindow Exception

企图2

设置安装为clr_loader的运行库,该运行时依赖于pythonnet

代码语言:javascript
运行
复制
from clr_loader import get_coreclr
from pythonnet import set_runtime

rt = get_coreclr("path_to_runtime_cong/net_core_rt_conf.json")
set_runtime(rt)

import clr

My Conf看上去像

代码语言:javascript
运行
复制
{
  "runtimeOptions": {
    "tfm": "net6.0",
    "framework": {
      "name": "Microsoft.NETCore.App",
      "version": "6.0.3"
    }
  }
}

microsoft.analysisservices.adomdclient.netcore.retail.amd64 nuget包解压缩到Nix (调用此pkg_path)上的.netCore安装的GAC中

然后尝试连接

代码语言:javascript
运行
复制
import pandas as pd
from sys import path
path.append(**pkg_path**)

clr.AddReference('System.Data')
clr.AddReference('Microsoft.AnalysisServices.AdomdClient')
from Microsoft.AnalysisServices.AdomdClient import AdomdConnection, AdomdDataAdapter

conn = AdomdConnection("Data Source=<MY_SERVER>;Catalog=<MY_CUBE>;")
conn.Open()

和我受到了的欢迎

代码语言:javascript
运行
复制
NotSupportedException: This feature is supported for a .NET Core client only on Windows systems.
---------------------------------------------------------------------------
NotSupportedException                     Traceback (most recent call last)
<command-3652263429411005> in <module>
     10 
     11 conn = AdomdConnection("Data Source=<MY_SERVER>;Catalog=<MY CUBE>;")
---> 12 conn.Open()
     13 cmd = conn.CreateCommand()
     14 cmd.CommandText = MDX_QUERY

NotSupportedException: This feature is supported for a .NET Core client only on Windows systems.
   at Microsoft.AnalysisServices.AdomdClient.XmlaClient.OpenConnectionAndCheckIfSessionTokenNeeded(ConnectionInfo connectionInfo)
   at Microsoft.AnalysisServices.AdomdClient.XmlaClient.<>c__DisplayClass94_0.<OpenConnection>b__0()
   at Microsoft.AnalysisServices.Security.TransparentUserContext.ExecuteInUserContextImpl[TResult](Func`1 action)
   at Microsoft.AnalysisServices.Security.UserContext.ExecuteInUserContext[TResult](Func`1 action)
   at Microsoft.AnalysisServices.AdomdClient.XmlaClient.OpenConnection(ConnectionInfo connectionInfo, Boolean& isSessionTokenNeeded)

总之,到目前为止,这似乎有点不可能。至少以直截了当的方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38985729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档