
Dataverse SDK for Python API 参考指南DataverseClient 核心方法、配置与错误处理实战【免费下载链接】awesome-copilotCommunity-contributed instructions, agents, skills, and configurations to help you make the most of GitHub Copilot.项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-copilot本文以 instructions/dataverse-python-api-reference.instructions.md 为骨架系统梳理 Microsoft Dataverse SDK for PythonPowerPlatform-Dataverse-Client预览版的核心 APIDataverseClient的 CRUD 与表元数据管理方法、DataverseConfig的客户端行为调优、DataverseError异常体系以及 OData 查询过滤的注意事项。读者完成后将能够直接用 Python 对 Dataverse 环境执行单条与批量数据操作、自定义表/列管理、缓存刷新并写出带重试与日志的生产级调用代码。DataverseClient 类概览DataverseClient是与 Dataverse 交互的主客户端使用环境组织 URLbase URL与 Azure 凭据credential进行初始化。推荐配合 Azure Identity 凭据使用例如InteractiveBrowserCredential本地开发、DefaultAzureCredential多环境通用或ClientSecretCredential无人值守场景具体认证模式可参见 instructions/dataverse-python-authentication-security.instructions.md。from azure.identity import InteractiveBrowserCredential from PowerPlatform.Dataverse.client import DataverseClient credential InteractiveBrowserCredential() client DataverseClient( base_urlhttps://myorg.crm.dynamics.com, credentialcredential )客户端是重量级对象官方推荐复用同一实例而不是频繁重建。仓库中的 skills/dataverse-python-production-code/SKILL.md 进一步给出了单例客户端模式DataverseService类持有唯一的_client用于避免重复认证与连接开销。核心 CRUD 方法create单条与批量创建create(table_schema_name, records)支持传入单个字典或字典列表返回创建的记录 GUID 列表。# 单条创建 ids client.create(account, {name: Acme}) print(ids[0]) # 第一个 GUID # 批量创建 ids client.create(account, [{name: Contoso}, {name: Fabrikam}])表名必须使用逻辑名schema name例如account创建的自定义表则通常以new_前缀命名。get单条读取与分页查询get(table_schema_name, record_idNone, select, filter, orderby, top, expand, page_size)是读写一体的查询入口传入record_id时取单条记录不传时按 OData 选项做查询并以批次batch迭代器形式返回配合page_size与top控制分页。# 读取单条记录 record client.get(account, record_idguid-here) # 带过滤与分页的查询 for batch in client.get( account, filterstatecode eq 0, select[name, telephone1], orderby[createdon desc], top100, page_size50 ): for record in batch: print(record[name])从源码结构看get在未指定record_id时内部走 RetrieveMultiple 语义将top、filter、select等参数翻译为 OData 查询表达式并按page_size逐页拉取top用于限制总返回数page_size用于控制每批大小二者结合可避免一次性拉取超大结果集。关于服务端过滤与列裁剪的优化原则可参见 skills/dataverse-python-advanced-patterns/SKILL.md 中OData 查询优化一节。update单条、广播与配对更新update(table_schema_name, ids, changes)支持三种更新形态# 单条更新按 GUID 定位一条记录 client.update(account, guid-here, {telephone1: 555-0100}) # 广播更新同一组字段变更应用到多个 ID client.update(account, [id1, id2, id3], {statecode: 1}) # 配对更新ID 列表与变更字典列表一一对应1:1 client.update(account, [id1, id2], [{name: A}, {name: B}])三种形态的语义差异值得注意广播broadcast适合批量状态流转如一次性停用多条记录配对paired适合每条记录有独立字段值的场景。批量更新性能优于循环单条更新是数据迁移与日常同步的首选。delete单条与异步批量删除delete(table_schema_name, ids, use_bulk_deleteTrue)删除单条或批量记录。批量删除默认走异步的 Bulk Delete 作业返回job_id适合大数据量清理。# 单条删除 client.delete(account, guid-here) # 批量删除异步返回作业 ID job_id client.delete(account, [id1, id2, id3])需要说明的是use_bulk_deleteTrue时的异步行为意味着删除并非立即完成调用方应根据返回的job_id跟踪作业状态适用于大规模数据清理场景。自定义表与元数据管理Dataverse SDK for Python 提供了一组完整的表元数据metadata管理 API支持在运行时创建、修改和删除自定义表适合实现代码即架构的建表流程。create_table创建自定义表create_table(table_schema_name, columns, solution_unique_nameNone, primary_column_schema_nameNone)用于创建自定义表。列类型通过 Python 类型映射字符串映射文本列、int映射整数列、decimal映射十进制列、bool映射布尔列选项集option set / picklist则用IntEnum子类配合__labels__字典声明显示标签语言代码1033表示英语美国。from enum import IntEnum class ItemStatus(IntEnum): ACTIVE 1 INACTIVE 2 __labels__ { 1033: {ACTIVE: Active, INACTIVE: Inactive} } info client.create_table(new_MyTable, { new_Title: string, new_Quantity: int, new_Price: decimal, new_Active: bool, new_Status: ItemStatus }) print(info[entity_logical_name])从返回值可以看出建表成功后返回的元数据信息中包含entity_logical_name实体逻辑名等字段可用于校验建表结果。solution_unique_name允许将表归入指定解决方案primary_column_schema_name用于指定主名字段。类型设计的最佳实践可参考 skills/dataverse-python-usecase-builder/SKILL.md 中的数据模型设计示例如 lookup、datetime、file 等列的建模。create_columns / delete_columns增删列# 向已有表添加列 created client.create_columns(new_MyTable, { new_Notes: string, new_Count: int }) # 从表中移除列 removed client.delete_columns(new_MyTable, [new_Notes, new_Count])delete_table删除自定义表delete_table(table_schema_name)删除自定义表该操作不可逆生产环境执行前务必确认数据已备份或迁移。client.delete_table(new_MyTable)get_table_info / list_tables读取表元数据# 获取单张表的元数据 info client.get_table_info(new_MyTable) if info: print(info[table_logical_name]) print(info[entity_set_name]) # 列出所有自定义表 tables client.list_tables() for table in tables: print(table)get_table_info返回的元数据中包含table_logical_name与entity_set_name实体集合名即 OData 查询时的路径段等关键信息list_tables则用于枚举环境中的自定义表适合做环境盘点或迁移前的差异分析。flush_cache刷新 SDK 缓存flush_cache(kind)用于清理 SDK 内部缓存典型场景是选项集picklist标签的缓存当元数据变更例如选项集新增了选项或修改了标签后旧缓存会导致读到的标签过期需要主动刷新。removed client.flush_cache(picklist)结合 skills/dataverse-python-advanced-patterns/SKILL.md 的建议在每次元数据变更建表、加列、改选项集之后调用相应的缓存刷新避免读到过期元数据。kind参数指定要清除的缓存类型例如picklist。DataverseConfig客户端行为配置DataverseConfig用于配置客户端行为超时、重试、语言等位于PowerPlatform.Dataverse.core.configfrom PowerPlatform.Dataverse.core.config import DataverseConfig cfg DataverseConfig() cfg.http_retries 3 # HTTP 重试次数 cfg.http_backoff 1.0 # 初始退避时间秒指数退避的基数 cfg.http_timeout 30 # 请求超时秒 cfg.language_code 1033 # 语言代码1033 表示英语美国 client DataverseClient(base_urlurl, credentialcred, configcfg)各参数含义与调优建议参数说明典型取值http_retries对瞬时失败429 限流、超时等的重试次数3http_backoff重试之间的初始退避时间秒配合指数退避策略1.0http_timeout单次请求的超时上限秒30language_code返回的标签语言代码LCID1033 为英语1033logging_enable是否开启详细请求日志便于排查问题True调试时其中http_retries、http_backoff、http_timeout的组合直接决定客户端对 Dataverse 限流429与网络抖动的耐受度重试次数越多、退避越大越能扛住限流但也会拉长整体耗时。关于指数退避与 429/超时重试的生产实现含time.sleep(2 ** attempt)的退避模板仓库 skills/dataverse-python-production-code/SKILL.md 给出了完整的operation_with_retry示例。language_code影响的是选项集等本地化标签的返回语言属于元数据层面的国际化配置。错误处理DataverseError 体系SDK 提供统一的DataverseError异常基类位于PowerPlatform.Dataverse.core.errors。捕获后可通过code、message、is_transient与to_dict()判断错误类型、决定是否重试from PowerPlatform.Dataverse.core.errors import DataverseError try: client.create(account, {name: Test}) except DataverseError as e: print(fCode: {e.code}) print(fMessage: {e.message}) print(fTransient: {e.is_transient}) print(fDetails: {e.to_dict()})重试决策的核心是is_transient仅对瞬时错误限流 429、网络超时等进行重试对非瞬时错误权限不足 403、校验失败等应直接失败并告警避免无意义的重试放大负载。to_dict()返回结构化的错误详情适合写入日志系统做审计。从仓库 skills/dataverse-python-production-code/SKILL.md 的异常导入可以看出错误体系还包含更具体的子类ValidationError参数校验、MetadataError元数据操作、HttpErrorHTTP 层错误。生产代码推荐按异常类型分级处理HttpError可重试配合指数退避与日志ValidationError/MetadataError属于调用方问题重试无意义。同时建议用logging模块替代print记录重试次数与最终失败信息见该 skill 中的错误处理结构与日志模式模板。OData 过滤与查询注意事项在使用get的filter、select、expand参数时需遵守以下三条规则filter表达式必须使用精确的逻辑名小写例如filterstatecode eq 0逻辑名统一小写字段名拼写错误会直接导致查询失败。select中的列名会自动转为小写SDK 内部会自动小写化因此大小写混写的列名也能正常工作但推荐始终使用小写逻辑名以保持一致。expand中的导航属性名区分大小写与select不同导航属性navigation property名称大小写敏感必须与元数据中定义的大小写完全一致。此外从 skills/dataverse-python-production-code/SKILL.md 的优化清单可以提炼出更完整的查询实践始终显式指定select只取所需列减少网络与内存开销filter在服务端执行避免全表拉取后在客户端过滤结合orderby、top做结果裁剪结合page_size做分页需要关联数据时用expand避免逐条二次查询。完整实战从安装到生产级调用综合以上 API 与仓库中的技能文档一条完整的生产链路如下# 安装 SDK官方包名当前为预览版 pip install PowerPlatform-Dataverse-Client安装与初始化细节可参见 skills/dataverse-python-quickstart/SKILL.md含pip install、InteractiveBrowserCredential认证、CRUD 单条/批量/分页示例与 instructions/dataverse-python.instructions.md环境准备、虚拟环境建议、.env加载密钥。生产级代码模板则见 skills/dataverse-python-production-code/SKILL.mdimport logging import time from PowerPlatform.Dataverse.client import DataverseClient from PowerPlatform.Dataverse.core.config import DataverseConfig from PowerPlatform.Dataverse.core.errors import DataverseError, HttpError from azure.identity import ClientSecretCredential import os logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s ) logger logging.getLogger(__name__) cfg DataverseConfig() cfg.http_retries 3 cfg.http_backoff 1.0 cfg.http_timeout 30 credential ClientSecretCredential( tenant_idos.environ[AZURE_TENANT_ID], client_idos.environ[AZURE_CLIENT_ID], client_secretos.environ[AZURE_CLIENT_SECRET] ) client DataverseClient( base_urlos.environ[DATAVERSE_URL], credentialcredential, configcfg ) def create_with_retry(records, max_retries3): for attempt in range(max_retries): try: return client.create(account, records) except HttpError as e: if attempt max_retries - 1: logger.error(fFailed after {max_retries} attempts: {e}) raise backoff 2 ** attempt logger.warning(fAttempt {attempt 1} failed, retrying in {backoff}s) time.sleep(backoff) except DataverseError as e: logger.error(fNon-retryable error: {e.to_dict()}) raise该示例集中体现了本文涉及的三大核心要素DataverseConfig调优重试/超时、DataverseError/HttpError分级错误处理仅对瞬时错误重试、以及DataverseClient的复用与日志审计。针对具体业务场景的端到端设计需求分析、数据建模、模式选择、性能优化可进一步参考 skills/dataverse-python-usecase-builder/SKILL.md 与 skills/dataverse-python-advanced-patterns/SKILL.md。参考与延伸阅读API 参考主文档instructions/dataverse-python-api-reference.instructions.md快速上手skills/dataverse-python-quickstart/SKILL.md认证与安全模式instructions/dataverse-python-authentication-security.instructions.md生产级代码规范单例、重试、日志skills/dataverse-python-production-code/SKILL.md高级模式批量、缓存、文件上传、Pandasskills/dataverse-python-advanced-patterns/SKILL.md场景化方案设计skills/dataverse-python-usecase-builder/SKILL.md入门基础安装、认证、常见任务instructions/dataverse-python.instructions.md【免费下载链接】awesome-copilotCommunity-contributed instructions, agents, skills, and configurations to help you make the most of GitHub Copilot.项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-copilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考