使用pyadomd刷新Azure Analysis Services模型时遇命名空间错误
解决Azure Analysis Services XMLA刷新命令命名空间错误问题
问题核心原因
Pyadomd的cursor.execute()方法会自动将传入的XMLA命令封装到<Envelope><Body><Execute><Command>结构中,手动添加SOAP信封或错误的命令层级会导致命名空间冲突;同时针对Azure AS的tabular模型,刷新命令的结构需要匹配服务要求的格式。
正确解决方案
- 移除手动添加的SOAP信封,只保留核心XMLA命令内容
- 使用
Batch命令包裹Refresh操作(Azure AS推荐的刷新方式,支持批量操作) - 使用与Azure AS版本匹配的命名空间,推荐用
http://schemas.microsoft.com/analysisservices/2012/engine/200(适配大多数现代Azure AS实例)
修改后的完整代码
from sys import path from azure.identity import DefaultAzureCredential # 添加ADOMD.NET库路径 path.append('\\Program Files\\Microsoft.NET\\ADOMD.NET\\150') from pyadomd import Pyadomd # 配置信息 database_name = 'database_name' data_source_suffix = 'data_source_suffix' resource_uri = "https://uksouth.asazure.windows.net" model_name = 'model_name' # 获取访问令牌 credential = DefaultAzureCredential() token = credential.get_token(resource_uri) access_token = token.token # 连接字符串 conn_str = f'Provider=MSOLAP;Data Source=asazure://uksouth.asazure.windows.net/{data_source_suffix};Catalog={database_name};User ID=;Password={access_token};' try: with Pyadomd(conn_str) as conn: print("连接成功。") with conn.cursor() as cursor: # 正确的XMLA刷新命令:用Batch包裹Refresh,使用匹配的命名空间 refresh_command = f""" <Batch xmlns="http://schemas.microsoft.com/analysisservices/2012/engine/200"> <Refresh> <Object> <DatabaseID>{database_name}</DatabaseID> <CubeID>{model_name}</CubeID> </Object> <Type>Full</Type> <CommitMode>transactional</CommitMode> </Refresh> </Batch> """ cursor.execute(refresh_command) print("数据模型刷新已启动。") except Exception as e: print(f"发生错误: {e}")
额外说明
- 若刷新整个数据库而非特定模型,可移除
<CubeID>{model_name}</CubeID>节点,仅保留<DatabaseID> - 若仍有命名空间问题,可尝试对应Azure AS版本的命名空间:
- 2022版本:
http://schemas.microsoft.com/analysisservices/2022/engine/922 - 2019版本:
http://schemas.microsoft.com/analysisservices/2019/engine
- 2022版本:
- 确保
DefaultAzureCredential获取的令牌拥有Azure AS的处理数据权限(如Azure Analysis Services Administrator角色)
内容的提问来源于stack exchange,提问作者Muhammad Pathan
相关产品推荐
相关产品推荐

