使用 awesome-copilot 的 dataverse-python-production-code 技能生成生产级 Dataverse Python 代码

发布时间:2026/11/11 5:55:26

使用 awesome-copilot 的 dataverse-python-production-code 技能生成生产级 Dataverse Python 代码 使用 awesome-copilot 的 dataverse-python-production-code 技能生成生产级 Dataverse Python 代码【免费下载链接】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导读dataverse-python-production-code是 awesome-copilot 仓库中面向 GitHub Copilot 的 Agent Skill定义于 skills/dataverse-python-production-code/SKILL.md它把微软 PowerPlatform-Dataverse-Client SDK 的工程化最佳实践固化为一套可复用的系统指令当你在 GitHub Copilot 中要求生成 Dataverse 相关 Python 代码时它会自动产出具备错误处理、指数退避重试、单例客户端、OData 优化、结构化日志与完整类型注解的生产级代码。读完本文你将掌握该技能的全部规则、其底层依据对应 instructions 系列文档并能在自己的项目里直接复制这套代码骨架运行。技能定位把能跑的代码升级为能上生产的代码该 Skill 的 frontmatter 明确声明了它的使命生成使用 Dataverse SDK 的生产就绪production-readyPython 代码并强制要求使用DataverseError异常层级实现正确的错误处理用单例客户端模式管理连接为 429 / 超时错误实现指数退避重试应用 OData 优化服务端过滤、只 select 需要的列实现用于审计与调试的日志包含类型注解type hints与 docstring遵循微软官方示例的最佳实践。它本质上是一份生成规范告诉 Copilot生成的代码必须长什么样而不是一份 SDK 使用手册。因此下面各节把它的每一条生成规则与仓库内对应的 instructions 文档逐一对照让你既知道规则是什么也知道为什么这样定。错误处理结构以 DataverseError 异常层级为核心SKILL.md 给出的基础错误处理骨架如下from PowerPlatform.Dataverse.core.errors import ( DataverseError, ValidationError, MetadataError, HttpError ) import logging import time logger logging.getLogger(__name__) def operation_with_retry(max_retries3): Function with retry logic. for attempt in range(max_retries): try: # Operation code pass 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)要真正正确地使用这个层级需要理解异常类携带的诊断信息。dataverse-python-error-handling.instructions.md 给出了DataverseError的完整构造与属性属性类型含义messagestr人类可读的错误消息codestr错误类别如validation_error、http_errorsubcodestr \| None更具体的错误标识符status_codeint \| NoneHTTP 状态码401、403、429 等detailsDict[str, Any] \| None附加诊断信息sourcestr \| None错误来源client或serveris_transientbool是否可能通过重试成功to_dict()dict转为字典便于日志记录典型的使用模式是按status_code分派处理try: client.get(account, record_idinvalid-id) except DataverseError as e: if e.status_code 401: # 认证失败检查凭据与令牌过期不要重试 print(Re-authenticate required) elif e.status_code 404: # 资源不存在使用默认数据兜底 record {name: Unknown, id: None} elif e.is_transient: # 瞬时错误可以重试 print(Transient error - may retry) else: raise重试策略哪些错误该重试哪些不该该技能要求为 429/超时错误实现指数退避重试文档中给出了明确的边界不要重试401认证失败、403授权失败、400客户端请求错误、404资源不存在。应该重试408、429、500、502、503、504并结合is_transient判断def should_retry(error: DataverseError) - bool: Determine if operation should be retried. if not error.is_transient: return False retryable_codes {408, 429, 500, 502, 503, 504} return error.status_code in retryable_codes def call_with_exponential_backoff(func, *args, max_attempts3, **kwargs): Call function with exponential backoff retry. for attempt in range(max_attempts): try: return func(*args, **kwargs) except DataverseError as e: if should_retry(e) and attempt max_attempts - 1: wait_time 2 ** attempt # 1s, 2s, 4s... print(fAttempt {attempt 1} failed. Retrying in {wait_time}s...) time.sleep(wait_time) else: raise注意一个关键前提dataverse-python-performance-optimization.instructions.md 明确指出该 SDK 的内置重试策略极简默认仅重试网络错误429 限流需要开发者手动处理这正是技能强制生成自定义重试逻辑的原因。客户端管理模式单例复用连接SKILL.md 提供的单例模板是生产代码的核心class DataverseService: _instance None _client None def __new__(cls, *args, **kwargs): if cls._instance is None: cls._instance super().__new__(cls) return cls._instance def __init__(self, org_url, credential): if self._client is None: self._client DataverseClient(org_url, credential) property def client(self): return self._client创建DataverseClient涉及认证握手与连接建立成本较高。反复 new 客户端是明确的反模式# ❌ ANTI-PATTERN: 每次调用都创建新客户端 def fetch_account(account_id): credential InteractiveBrowserCredential() client DataverseClient(https://yourorg.crm.dynamics.com, credential) return client.get(account, account_id) # ✅ 正确做法全局单例创建一次反复复用 from azure.identity import DefaultAzureCredential from PowerPlatform.Dataverse.client import DataverseClient _client None def get_client(): global _client if _client is None: _client DataverseClient( base_urlhttps://myorg.crm.dynamics.com, credentialDefaultAzureCredential() ) return _client认证方式与环境匹配SKILL 要求配置管理secrets、URLs落到代码里。Dataverse SDK 基于 Azure Identity 做令牌认证不同运行环境应选择不同凭据类型详见 dataverse-python-authentication-security.instructions.md本地开发InteractiveBrowserCredential()弹浏览器交互登录多环境应用推荐生产DefaultAzureCredential()按环境变量 → VS Code → Azure CLI → PowerShell → 托管标识链式探测同一份代码可在 dev/test/prod 无改动运行无值守任务定时作业、脚本、本地服务ClientSecretCredential从AZURE_TENANT_ID、AZURE_CLIENT_ID、AZURE_CLIENT_SECRET环境变量读取服务主体 客户端密钥高安全环境ClientCertificateCredential证书认证。安全要点严禁把密钥硬编码进源码一律通过环境变量或 Azure Key Vault 注入。客户端配置from PowerPlatform.Dataverse.core.config import DataverseConfig cfg DataverseConfig(language_code1033) # 默认 1033英文 cfg.http_timeout 30 # 请求超时 cfg.connection_timeout 5 # 连接超时 client DataverseClient( base_urlhttps://myorg.crm.dynamics.com, credentialcredential, configcfg )其中language_code控制 API 返回的语言默认 1033http_retries/http_backoff/http_timeout在配置类中为内部保留项。日志模式用 logger 取代 print为审计与排障留痕SKILL.md 给出了标准日志初始化模板import logging logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s ) logger logging.getLogger(__name__) logger.info(fCreated {count} records) logger.warning(fRecord {id} not found) logger.error(fOperation failed: {error})生产级场景下dataverse-python-error-handling.instructions.md 还建议同时输出到文件与标准输出并单独开启 SDK 内部日志import logging import sys logging.basicConfig( levellogging.DEBUG, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(dataverse_sdk.log), logging.StreamHandler(sys.stdout) ] ) logging.getLogger(azure).setLevel(logging.DEBUG) logging.getLogger(PowerPlatform).setLevel(logging.DEBUG)对于审计场景建议把错误序列化为结构化 JSON 记录含时间戳、上下文、error.to_dict()并用装饰器包装操作以记录每次调用的耗时与成败这样既有审计留痕又能发现性能劣化。OData 优化把计算留在服务端SKILL.md 的 OData 优化规则非常精炼核心四条始终带select参数限制返回列在服务端用filter过滤使用小写逻辑名用orderby、top做分页可用时用expand拉取关联记录。对应到代码dataverse-python-best-practices.instructions.md 与 dataverse-python-performance-optimization.instructions.md# ❌ 慢取全列再在内存里过滤 accounts client.get(account, top100) active [a for a in accounts if a.get(statecode) 0] # ✅ 快服务端过滤 只取需要的列 accounts client.get( account, select[accountid, name, telephone1, creditlimit], filterstatecode eq 0, top100 )大小写规则是最容易踩的坑filter 中的逻辑名必须小写filtername eq Contoso正确Name eq Contoso会失败而字符串值本身仍区分大小写。常用 filter 表达式filterstatecode eq 0 # 相等 filtercontains(name, Acme) # 包含 filtercreditlimit gt 50000 # 大于 filtercreatedon lt 2024-01-01 # 小于 filter(name eq Contoso) and (creditlimit gt 50000) # 与 filter(industrycode eq 1) or (industrycode eq 2) # 或 filternot(statecode eq 1) # 非分页与批量操作client.get返回懒加载的生成器逐页拉取内存友好pages client.get( account, select[accountid, name, createdon], orderby[name asc], top5000, # 总上限 page_size500 # 每页大小 ) for page in pages: for record in page: process_record(record)批量写操作优先一次调用传多记录SDK 自动使用 CreateMultiple / 批量更新避免循环内逐个createpayloads [{name: fAccount {i}, telephone1: f555-{i:04d}} for i in range(1000)] ids client.create(account, payloads) # 一次 API 调用创建多条批量大小可按表复杂度调整OOB 表Account/Contact/Lead200–300 条/批、简单表 ≤10、中等复杂 ≤100、大型复杂表 10–20 条/批。超大文件128 MB上传时使用client.upload_file(..., modechunk, if_none_matchTrue)SDK 自动按 4 MB 分片并行上传。代码结构规范与质量检查清单SKILL.md 规定生成的代码必须遵循固定结构Imports标准库 → 第三方 → 本地模块常量与枚举日志配置辅助函数核心服务类错误处理类使用示例。同时设置了一份可当评审标准用的质量清单全部代码必须是语法正确的Python 3.10API 调用必须包含 try-except函数参数与返回值必须有类型注解所有函数必须有 docstring瞬时故障必须实现重试逻辑消息输出必须用logger而非print()必须包含配置管理secrets、URLs 从环境注入遵循 PEP 8注释中必须给出使用示例。当用户请求生成代码时技能要求 Copilot 按固定顺序交付Imports 段 → 配置段常量/枚举→ 主体实现含错误处理→ docstring → 类型注解 → 使用示例 → 错误场景 → 日志语句确保每次生成的结构一致、可评审、可维护。实战把规则拼成一份完整的生产级服务把以上模式组合起来即得到技能期望的最终形态——一个可复制的生产级服务结合 dataverse-python-sdk.instructions.md 的 CRUD 语义create返回 GUID 列表、update/delete返回 NoneDataverse 生产级服务单例 重试 日志 OData 优化。 import logging import os import time from typing import Any, Dict, List from azure.identity import DefaultAzureCredential from PowerPlatform.Dataverse.client import DataverseClient from PowerPlatform.Dataverse.core.config import DataverseConfig from PowerPlatform.Dataverse.core.errors import DataverseError, HttpError logger logging.getLogger(__name__) logging.basicConfig(levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s) ORG_URL os.environ[DATAVERSE_ORG_URL] # 配置管理从环境注入 class DataverseService: 基于单例模式的 Dataverse 客户端封装。 _instance: DataverseService | None None _client: DataverseClient | None None def __new__(cls, *args, **kwargs) - DataverseService: if cls._instance is None: cls._instance super().__new__(cls) return cls._instance def __init__(self) - None: if self._client is None: cfg DataverseConfig(language_code1033) self._client DataverseClient( base_urlORG_URL, credentialDefaultAzureCredential(), configcfg, ) property def client(self) - DataverseClient: assert self._client is not None return self._client def create_with_retry(self, table: str, payload: Dict[str, Any], max_retries: int 3) - List[str]: 带指数退避重试的创建操作仅重试 429/5xx 等瞬时错误。 for attempt in range(max_retries): try: return self.client.create(table, payload) except HttpError as e: if attempt max_retries - 1 or e.status_code not in {408, 429, 500, 502, 503, 504}: raise wait 2 ** attempt logger.warning(Attempt %d failed with %s, retrying in %ss, attempt 1, e.status_code, wait) time.sleep(wait) raise RuntimeError(unreachable) def get_active_accounts(self, top: int 100) - List[Dict[str, Any]]: 服务端过滤 仅取所需列的分页查询。 records: List[Dict[str, Any]] [] for page in self.client.get( account, select[accountid, name, telephone1, creditlimit], filterstatecode eq 0, orderby[name asc], toptop, page_size200, ): records.extend(page) logger.info(Fetched %d active accounts, len(records)) return records与仓库其他资源的衔接该技能不是孤立的仓库为其准备了完整的学习与执行支撑链快速入门与 CRUD 语义dataverse-python-sdk.instructions.md安装pip install PowerPlatform-Dataverse-Client、连接、单条/批量 CRUD、表元数据操作错误处理与排障对照表dataverse-python-error-handling.instructions.md401/403/404/429/5xx 的成因与处置清单性能与优化dataverse-python-performance-optimization.instructions.mdselect/filter/分页/批量/限流/大文件分片最佳实践与反模式dataverse-python-best-practices.instructions.md单例、批量、PEP 8、Dos Donts认证与安全dataverse-python-authentication-security.instructions.md凭据选型与密钥管理。若在 Copilot 会话中加载该 Skill即可把上述全部规则固化为每次代码生成的默认行为。需要进一步定制生成风格时可参照仓库 instructions/instructions.instructions.md 的规范编写自定义指令文件并与该 Skill 组合使用。小结dataverse-python-production-code用一套可复现的代码骨架把 Dataverse SDK 生产化最关键的五个工程问题——错误分层与重试、连接复用、日志审计、OData 优化、代码结构一致性——固化为 Copilot 的生成契约。理解其每条规则的底层依据SDK 内建重试极简、批量操作自动优化、filter 需小写逻辑名、懒加载分页等你就能在 Copilot 之外手动复现同样的生产级代码并依据其质量清单完成代码评审。结合仓库内 instructions 系列文档与 SKILL.md 本身你可以持续迭代出符合团队规范的 Dataverse 数据访问层。【免费下载链接】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),仅供参考
延伸阅读

更多相关文章

2026/11/9 1:21:45

芝麻苗期小目标检测专用数据集与YOLOv8调优指南

简介:本资源是面向农业智能识别领域的目标检测专用数据集,专为YOLO系列、Faster R-CNN、SSD等主流模型训练设计,解决芝麻作物与杂草在田间图像中的精细化区分难题,适用于深度学习初学者实践与农业AI项目研发人员快速验证算法效果。…

2026/11/11 5:52:51

河池去哪考电工证千万别踩坑

河池去哪考电工证千万别踩坑 之前考的证在外省能不能转过来?这个问题,我听得太多了。很多人因为在外省考了电工证,回来后发现不被认可,或者流程太复杂,干脆就放弃了。别急,今天我就从一个干了10年应急管理行业的老手角度,带你搞清楚【河池去哪考电工…

2026/11/11 5:52:51

河北电工证怎么下载含金量高吗学历不高怕报不上名怎么办

河北电工证怎么下载含金量高吗学历不高怕报不上名怎么办 学历不高怕报不上名,这是很多准备考电工证的兄弟心里最怕的事。特别是像你这种刚毕业的应届生,手里只有个大专或者本科文凭,但工作经验几乎为零,担心自己连报名资格都没有。其实,…

2026/11/11 5:52:51

工地太忙根本没时间复习考试,启东市考电工证官方报名入口怎么走

工地太忙根本没时间复习考试,启东市考电工证官方报名入口怎么走 工地太忙根本没时间复习考试,这是多少一线施工人员的真实写照。特别是像启东市这样的地方,建筑项目多、工期紧,一线电工不仅要承担日常的电力维护,还得随时应对突发的电路故障。然而,…

2026/11/11 5:52:51

西华中级电工证培训值不值得考?怕被中介坑的看过来

西华中级电工证培训值不值得考?怕被中介坑的看过来 你是不是也这样,想考个电工证,但不知道从哪儿开始?网上一搜,一堆培训机构,价格五花八门,内容真假难辨,搞得人心里没底。尤其是对西华地区的中级电工证培训来说, 值不值得考…

2026/11/11 5:47:51

佛山电工证换证要多久 官方回应流程全解析

佛山电工证换证要多久 官方回应流程全解析 你还在为没电工证而着急?佛山电工证换证要多久?这直接关系到你能不能顺利上岗找工作。现在电工证已经成为很多行业的“入场券”,尤其是在建筑、电力、制造业等领域,没有电工证根本无法开展工作。官方回应明确,…

2026/11/10 8:12:38

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/11 0:02:26

考低压电工证通过率考试真题与备考技巧

低压电工证通过率高不高?学历不高也能考,值不值得考? 你是不是总听说电工证能帮你找高薪工作,但又担心自己学历不够,考不上?其实,低压电工证考试门槛并没有你想象中那么高,关键是方法对不对。这篇文章就告诉你, 考低压电工证通过率到底有多高 ,…

2026/11/11 0:02:26

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名 你是不是也和我一样,刚毕业就听说低压电工证学时必须达标才能上岗?可一打听,发现报名机构五花八门,价格参差不齐, 不知道去哪报名怕被中介坑…

2026/11/10 20:08:15

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑