ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Archery 表实例定位(Table Instance Locator)API 设计决策全解:从输入契约到可替换 Provider 与前端防抖交互

Archery 表实例定位(Table Instance Locator)API 设计决策全解:从输入契约到可替换 Provider 与前端防抖交互 后端数据库【免费下载链接】ArcherySQL 审核查询平台项目地址https://gitcode.com/gh_mirrors/ar/Archery点击查看免费下载本文以 specs/001-table-instance-locator/research.md 决策记录为主线系统梳理 Archery SQL 审核查询平台中按表名定位所属实例功能的完整设计脉络。你将掌握该功能从请求/响应契约、SQL-LIKE 模式匹配语义、TABLE_INSTANCE_LOCATOR可替换实现入口、部分失败摘要到 500ms 防抖前端交互与 XSS 安全编码的每一项决策依据并结合 table_instance_locator.py、api_instance.py 等源码与测试用例印证落地细节可直接复用于同类多实例元数据检索能力的建设。一、功能定位为什么需要表定位接口在多实例、多数据库的 SQL 审核查询平台中一个常见痛点是用户知道表名却不知道目标表位于哪一个实例、哪一个数据库。传统做法是逐个实例登录排查成本极高。该功能的目标即输入表名或匹配模式系统遍历当前用户有查询权限的全部实例返回包含该表的(实例, 数据库, 表名)三元组列表帮助用户快速定位目标实例后继续查询分析。从 spec.md 的功能需求FR看该能力被拆分为四条用户故事User StoryUS1P1MVP按精确表名或模式匹配返回权限范围内的实例列表US2P2支持在不改变调用方入参与出参结构的前提下替换定位实现settings.TABLE_INSTANCE_LOCATORUS3P3无匹配结果与部分实例不可用时仍返回可解释反馈US4P2SQL 查询页面右侧面板新增表定位输入框带防抖自动调用接口并支持点击结果自动填充选择器。与之配套research.md 以 10 条决策Decision 1–10固化了该功能的关键技术选型。下文逐条展开并同步给出源码级证据。二、Decision 1输入模式与校验契约决策内容请求对象必须且只能携带table_name精确匹配或table_pattern模式匹配二者之一拒绝空字符串拒绝同时携带或都不携带的请求。决策理由与 FR-001支持两种输入方式之一和 FR-002严格校验请求结构、不满足规则时返回明确错误且不进入定位流程对齐避免产生歧义匹配行为。被否决的备选方案同时接收两个字段并按优先级处理——被拒因为会产生隐藏的优先级规则调试困难只保留table_name——被拒因为规格明确要求模式匹配能力。在 OpenAPI 契约 contracts/table-instance-locator.openapi.yaml 中这一互斥约束被表达为oneOfnot组合oneOf: [{required: [table_name]}, {required: [table_pattern]}]同时not: {required: [table_name, table_pattern]}且additionalProperties: false。两个字段均约束maxLength: 256。落地层面当前 v0 实现使用 serializers.py 中的TableInstanceLookupSerializertable_name serializers.CharField(label表名, max_length256)视图层在 api_instance.py 中处理校验失败if not serializer.is_valid(): errors serializer.errors msg 参数校验失败 if table_name in errors: msg f参数table_name错误: {errors[table_name][0]} return Response({status: 1, msg: msg, count: 0, data: []})即校验失败时返回 HTTP 200 业务状态码status1而非 400 异常保证响应体结构始终可解析契约中 400 分支也复用TableLocatorResponse结构。注意规格要求校验空白输入不执行遍历这一点也体现在前端——输入框内容为空时直接取消待发请求、清空结果列表根本不调用后端见第七节。三、Decision 2模式匹配语义——SQL-LIKE 而非正则决策内容模式匹配采用大小写不敏感的 SQL-LIKE 语义%匹配任意长度、_匹配单个字符在内部转换为安全的匹配器执行。决策理由%/_通配符对数据库使用者而言熟悉、易解释、易文档化且跨引擎行为一致。被否决的备选方案仅支持 Python 正则——被拒对非技术 API 消费者而言可预测性差采用各数据库引擎原生 pattern 语法——被拒存在跨引擎一致性风险。plan.md 给出了实现级语义SQL-LIKE 通过正则转换实现%→.*_→.配合re.IGNORECASE由 table_instance_locator.py 中的_match_table(table_name, candidate, match_mode)辅助函数承载。测试任务 T005 明确要求覆盖%匹配多字符、_匹配单字符、大小写不敏感、精确模式拒绝不匹配、pattern 模式接受%部分匹配。当前默认实现中精确匹配对表名做了lower()归一化后逐一比对见default_table_instance_locator中normalized_tb.lower() lower_table_name同样体现大小写不敏感原则。四、Decision 3Provider 扩展点——TABLE_INSTANCE_LOCATOR决策内容保留基于配置的 Provider 加载方式通过settings.TABLE_INSTANCE_LOCATOR指定自定义实现并强制要求 Provider 的输入输出归一化到固定响应结构。决策理由在满足 FR-006替换实现与默认实现使用一致请求/响应结构的前提下保留既有扩展行为。被否决的备选方案移除自定义 Provider——被拒可扩展性是核心需求插件注册表 动态发现——被拒v1 阶段复杂度不可接受。源码中 table_instance_locator.py 实现了完整的加载与归一化链路def _load_custom_locator(): locator_path getattr(settings, TABLE_INSTANCE_LOCATOR, ) if not locator_path: return None try: module, fn_name locator_path.split(:, 1) locator getattr(importlib.import_module(module), fn_name) except Exception as e: raise RuntimeError(f自定义TABLE_INSTANCE_LOCATOR加载失败: {e}) if not callable(locator): raise RuntimeError(自定义TABLE_INSTANCE_LOCATOR不是可调用对象) return locator def resolve_table_instances(table_name, instances, **kwargs): locator _load_custom_locator() or default_table_instance_locator result locator(table_nametable_name, instancesinstances, **kwargs) if not isinstance(result, list): raise ValueError(table instance locator必须返回list) # ... 逐项归一化校验 dict、name 非空补充 id/db_type/db_name/table_name配置示例quickstart.mdTABLE_INSTANCE_LOCATOR my_module.my_locator:locate配置字符串格式为模块路径:可调用对象名。Provider 的契约要求数据模型>summary: { processed_instance_count: 5, successful_instance_count: 4, failed_instance_count: 1, failure_reasons: [ {instance_id: 21, instance_name: legacy-pg, reason: metadata timeout} ] }数据模型强约束processed success failedfailure_reasons长度应与failed_instance_count一致。序列化层面serializers.py 已定义LocatorFailureReasonSerializer、LocatorExecutionSummarySerializer与TableInstanceLookupResponseSerializersummary为可选字段、可空。测试任务 T16/T17 要求验证实例引擎错误记录进failure_reasons、失败计数逐实例递增、成功实例仍出现在结果中、零权限与无匹配场景下status0且processed_instance_count正确。六、Decision 5稳定排序决策内容最终结果按(instance_name, db_name, table_name, instance_id)升序排序。决策理由确定性响应满足 FR-009相同输入与权限范围下结果稳定可重复简化客户端 diff 与缓存。被否决的备选方案保留遍历顺序——被拒后端实例遍历顺序可能漂移仅按实例 id 排序——被拒可读性对用户不友好。实现任务 T010 规定在resolve_table_instances中增加稳定排序按(instance_name, db_name, table_name or , instance_id or 0)升序。测试任务 T006 要求用乱序输入验证输出确定性。七、前端交互防抖触发、结果展示、API 调用与 XSS 安全Decision 7/8/9/10四段决策共同构成前端sqlquery.html中表定位小组件的完整行为实际代码位于 sql/templates/sqlquery.html。7.1 Decision 7500ms 防抖自动触发决策输入框使用 500ms 防抖输入 ≥1 个字符后自动触发清空时取消待发请求并清空结果列表。理由避免每次击键都发起 API 请求后端需遍历多实例成本高1 字符起步适用于中文表名如订单第一个字即可缩窄范围。被否决按钮手动触发增加操作步骤、3 字符触发阈值对中文表名门槛过高。落地逻辑#table-locator-input的input事件var _locatorTimer null; // 每次输入clearTimeout(_locatorTimer) // 空输入abort _locatorXHR、清空结果、隐藏 loading、直接 return // 非空输入_locatorTimer setTimeout(function(){ locateTable(); }, 500)locateTable()发送请求前还会_locatorXHR.abort()中断上一个未完成的请求配合complete回调中_locatorXHR null的复位彻底避免竞态。7.2 Decision 8单列结果展示决策以实例名/数据库名/表名拼接字符串每条结果渲染为li列表项包裹在输入框下方的无序列表中。理由用户确认单列拼接文本即可满足需求信息密度适中、无需多列表格、符合 Bootstrap 3 风格。被否决多列 Bootstrap Table引入额外依赖、下拉 selectpicker适合预加载有限选项不适合动态搜索结果。HTML 结构来自 quickstart.md 与模板源码div classform-group iddiv-table-locator input idtable-locator-input typetext classform-control placeholder按表名定位实例如 orders autocompleteoff/ div idtable-locator-loading styledisplay:none small classtext-muted查询中.../small /div ul idtable-locator-results classlist-unstyled stylemax-height:160px;overflow-y:auto;/ul /div该区块按 T21 要求插入在右侧面板#instance_nameform-group 之前。7.3 Decision 9jQuery$.ajaxPOST CSRF决策使用 jQuery$.ajaxPOST 调用/v1/instance/table-instances/携带 Django CSRF token请求体为 JSONtable_name字段。理由与 sqlquery.html 既有全部 AJAX 调用风格一致无需引入新依赖。被否决fetch API与现有风格不一致、需额外处理 CSRF、首版纯 pattern 模式首版用精确匹配降低复杂度pattern 支持留给后续任务。实际调用注意 URL 前缀/api/来自 archery/urls.py 的根路由挂载路由注册见 sql_api/urls.py_locatorXHR $.ajax({ type: post, url: /api/v1/instance/table-instances/, contentType: application/json, dataType: json, data: JSON.stringify({table_name: tableName}), complete: function () { $(#table-locator-loading).hide(); _locatorXHR null; }, success: function (data) { if (data.status 0 data.data data.data.length 0) { // 每条渲染为 $(li)携带>pytest -q sql_api/test_table_instance_locator.py按故事分组运行pytest -q sql_api/test_table_instance_locator.py -k us1 or serializer or pattern or sort or permission pytest -q sql_api/test_table_instance_locator.py -k us2 or custom or provider or normalize pytest -q sql_api/test_table_instance_locator.py -k us3 or summary or partial or empty or no_permission测试文件 test_table_instance_locator.py 提供了两个代表性用例test_default_table_instance_locator_found用FakeEngine返回{archery: [users, orders]}monkeypatchget_engine验证精确匹配orders返回实例与库名test_instance_outside_resource_group_excluded唯一集成测试验证无资源组关联的用户即使表真实存在也得到空结果其 docstring 明确说明DRF auth wiring 权限过滤无法仅靠单元测试完全证明符合 TSC-004 的集成测试理由要求。九、完整 API 契约速查汇总决策与数据模型的最终接口形态来自 plan.md 与 OpenAPI 契约POST /api/v1/instance/table-instances/ Content-Type: application/json Body: {table_name: orders} 或 {table_pattern: ord%}请求字段table_name精确≤256 字符、table_patternLIKE 模式≤256 字符二者互斥、去空白后非空结果项字段instance_name/db_type/db_name必填instance_id/table_name/match_typeexact/pattern可选可选字段缺失时省略而非置 null响应结构status0成功或部分成功非 0校验/运行失败、msg、count、data、summary部分失败摘要排序(instance_name, db_name, table_name, instance_id)升序权限边界遍历范围由调用方user_instances(request.user)resource_group.py注入定位器与 Provider 均不得越权返回任何未授权实例信息FR-007。十、设计启示小结纵览这 10 条决策可以提炼出几个具有普适性的设计原则契约优先、输入收口用互斥输入 固定响应结构降低歧义为可替换实现奠定基础对外用熟悉语义对内安全转换对用户暴露 SQL-LIKE 通配符内部映射为正则并大小写不敏感兼顾易用与跨引擎一致部分成功优于整体失败以summary兜底可诊断性避免单点故障拖垮全量检索确定性优于偶然性显式排序规则让响应可 diff、可缓存前后端决策联动防抖阈值、触发字符数、展示格式均以真实用户反馈问题 Q3/Q4/Q5为准前端实现与后端契约严格对齐XSS 安全作为硬性输出约束贯穿始终。对于需要在自研平台中实现跨多实例检索元数据的团队本功能从决策记录research.md到规格spec.md、数据模型data-model.md、实现计划plan.md、任务清单tasks.md、OpenAPI 契约与可运行测试的完整链路是一套可以直接借鉴的工程范本。赞分享后端数据库【免费下载链接】ArcherySQL 审核查询平台项目地址https://gitcode.com/gh_mirrors/ar/Archery点击查看免费下载相关推荐JVFloatLabeledTextField输入防抖实现提升表单交互体验JVFloatLabeledTextField输入防抖实现提升表单交互体验 在iOS应用开发中表单交互的流畅性直接影响用户体验。当用户快速输入内容时输入框移动开发Ace模板引擎与Go标准库完美结合的HTML渲染方案Ace模板引擎与Go标准库完美结合的HTML渲染方案 想要在Go Web开发中寻找一个既简洁又强大的HTML模板引擎吗Ace模板引擎正是您需要的终极解决方案开发工具Playwright Locator 类完全指南定位、自动等待与交互 API 全解析Playwright Locator 类完全指南定位、自动等待与交互 API 全解析 本文以仓库文档 class locator.md https://lin测试开发工具浏览器控制上一篇深度解析如何利用AI视觉模型与语音识别构建智能视频分析系统下一篇JustTrustMe错误排查手册解决安装、激活和功能异常的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表