Metabase 嵌入式分析 SDK:EntityTypeFilterKeys 类型详解与数据选择器实体过滤实践
数据分析数据可视化后端数据库客户端企业应用【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址https://gitcode.com/GitHub_Trending/me/metabase点击查看免费下载导读本文聚焦 Metabase 嵌入式分析 SDK 中的EntityTypeFilterKeys类型——一个仅包含table | model两个字面量的联合类型。它是控制嵌入式问题Question数据选择器Data Picker中可选数据源类型的核心开关。读完本文你将掌握EntityTypeFilterKeys的定义、它在 SDK 组件与 iframe 嵌入中的实际应用位置以及如何通过entityTypes属性精确限定最终用户只能从「表」或「模型」中选择数据源从而定制更安全的嵌入式分析体验。EntityTypeFilterKeys是 Metabase 嵌入式分析 SDKEmbedding SDK中暴露给宿主应用Host App的类型别名之一其完整定义如下type EntityTypeFilterKeys table | model;这一类型在仓库中的权威定义位于 frontend/src/embedding-sdk-bundle/types/question.ts#L170并被 docs/embedding/sdk/api/snippets/EntityTypeFilterKeys.md 收录为 SDK API 文档的独立类型条目同时生成了对应的 HTML 文档 docs/embedding/sdk/api/EntityTypeFilterKeys.html。一、类型语义为什么是 table 与 modelEntityTypeFilterKeys是一个字符串字面量联合类型String Literal Union Type可接受的值只有两个取值含义数据源形态table物理表数据库中的原生表数据库表直接来自已连接的数据库model模型基于查询封装的数据集由 Question 或 SQL 查询保存生成的虚拟数据集需要特别注意的是EntityTypeFilterKeys并不包含question。在仓库中存在一个与其形态相近但取值范围更宽的类型 EmbeddingEntityTypetype EmbeddingEntityType model | table | question;两者在 SDK 内部各司其职EmbeddingEntityType是内部通用实体类型出现在数据选择器上下文frontend/src/metabase/redux/store/embedding-data-picker.ts、Redux 状态切片frontend/src/metabase/redux/embedding-data-picker.ts以及 iframe 嵌入的dataPickerEntityTypes等场景EntityTypeFilterKeys是面向宿主应用对外暴露的公共 API 类型专门用于QuestionEmbedOptions与ExplorationEmbedOptions中的entityTypes属性作用是把宿主允许的实体范围从「默认宽集合」收窄到「仅表与模型」。从类型设计的角度看对外 API 刻意排除了question作为EntityTypeFilterKeys的合法值这是为了约束嵌入场景中新建问题的数据源选择范围避免最终用户在嵌入环境里把其他 Question 当作数据源从而保持嵌入数据边界的可预测性。二、EntityTypeFilterKeys 在 SDK 组件属性中的应用EntityTypeFilterKeys最核心的使用位置是 iframe 嵌入类型定义文件 frontend/src/metabase/embedding/embedding-iframe-sdk/types/embed.ts它被用于两处entityTypes属性QuestionEmbedOptions嵌入问题组件embed.ts#L130-L153export type QuestionEmbedOptions StrictUnion { questionId: number | string | null } | { token: EntityToken } { componentName: metabase-question; drills?: boolean; withTitle?: boolean; withDownloads?: boolean; withAlerts?: boolean; targetCollection?: CollectionId; entityTypes?: EntityTypeFilterKeys[]; // ← 限定数据源类型 isSaveEnabled?: boolean; // ... };ExplorationEmbedOptions探索式嵌入embed.ts#L166-L178export interface ExplorationEmbedOptions { componentName: metabase-question; template: exploration; isSaveEnabled?: boolean; targetCollection?: CollectionId; entityTypes?: EntityTypeFilterKeys[]; // ← 同上 // ... }而在模块化嵌入 SDKReact SDK一侧虽然SdkQuestionProps的entityTypes属性在文档类型标注中引用的是更宽的EmbeddingEntityType[]见 docs/embedding/sdk/api/snippets/SdkQuestionProps.md#L11但其语义与EntityTypeFilterKeys完全一致——都是「指定数据选择器中可用的实体类型数组」。三、entityTypes的传递链路与数据选择器行为要真正理解EntityTypeFilterKeys的作用需要追踪entityTypes在 SDK 中的完整传递与消费链路。3.1 iframe 嵌入的透传在 iframe 嵌入路由组件 frontend/src/metabase/embedding/embedding-iframe-sdk/components/SdkIframeEmbedRoute.tsx#L344-L359 中嵌入设置中的settings.entityTypes会被直接透传给SdkQuestion组件SdkQuestion questionId{settings.questionId ?? null} token{settings.token} // ... targetCollection{settings.targetCollection} entityTypes{settings.entityTypes} /在构建嵌入属性embed attributes的工具函数 frontend/src/metabase/embedding/embedding-iframe-sdk-setup/utils/build-embed-attributes.ts#L50-L64 中entityTypes仅在非空数组时才被写入嵌入配置entityTypes: questionSettings.entityTypes?.length ? questionSettings.entityTypes : /* 省略时保持默认 */,3.2 数据选择器中的过滤逻辑entityTypes最终在数据选择器组件 frontend/src/metabase/querying/notebook/components/NotebookDataPicker/EmbeddingDataPicker/EmbeddingDataPicker.tsx 中被消费组件同时读取 React Context 与 Redux 中的实体类型EmbeddingDataPicker.tsx#L57-L67两者取其一后作为最终过滤依据当数据源总数小于 100时使用「简单下拉式选择器」simple data picker其中仅允许model与tableEmbeddingDataPicker.tsx#L82-L97并将过滤后的实体类型传给SimpleDataPicker当数据源总数达到 100 及以上或显式设置dataPicker: staged时切换为分阶段数据选择器staged picker通过canSelectModel{entityTypes.includes(model)}、canSelectTable{entityTypes.includes(table)}三个开关分别控制模型、表与 Question 的可选性EmbeddingDataPicker.tsx#L141-L143。需要特别说明entityTypes: [question]只在 staged picker 中生效见 docs/embedding/sdk/api/snippets/EditableDashboardProps.md#L12 与 docs/embedding/sdk/api/EditableDashboardProps.html 中dataPickerProps的说明。由于EntityTypeFilterKeys本身不含question这意味着使用该类型作为entityTypes时无论哪种 picker 形态最终用户的数据源选择范围都被稳定限定在「表」和「模型」两类实体上。3.3 Redux 状态层的默认值与校验兜底在模块化嵌入中entityTypes由 React Context 直接注入而在全应用嵌入full-app embedding中则依赖 Redux 切片 frontend/src/metabase/redux/embedding-data-picker.tsexport const DEFAULT_EMBEDDING_ENTITY_TYPES: EmbeddingEntityType[] [ model, table, ];该切片提供normalizeEntityTypes函数embedding-data-picker.ts#L60-L78其核心作用包括从传入数组中过滤掉不在白名单[model, table, question]中的非法值当过滤后结果为空如传了[]时回退到默认值[model, table]保证选择器不会因空数组而失效。这印证了table | model作为默认与最小可用集合的设计意图即便宿主完全不传entityTypes嵌入环境默认仍向用户开放「表 模型」两类数据源。四、实战用法在嵌入式问题中限定数据源类型4.1 React SDK模块化嵌入示例在InteractiveQuestion/CreateQuestion等组件中通过entityTypes属性控制数据选择器import { InteractiveQuestion } from metabase/embedding-sdk-react; export default function TablesOnlyQuestion() { return ( InteractiveQuestion questionId{42} entityTypes{[table]} // 仅允许选择物理表 dataPickerstaged // 强制使用分阶段数据选择器 / ); }若只想开放模型InteractiveQuestion questionId{42} entityTypes{[model]} /4.2 可编辑仪表盘中的dataPickerProps在EditableDashboard中新建问题时的数据选择器行为通过dataPickerProps透传。仓库内置的示例 docs/embedding/sdk/snippets/dashboards/editable-dashboard-data-picker.tsx 展示了「仅表」的配置import React from react; import { EditableDashboard } from metabase/embedding-sdk-react; export default function TablesOnlyDashboard() { const dashboardId 1; // This is the dashboard ID you want to embed return ( EditableDashboard dashboardId{dashboardId} dataPickerProps{{ entityTypes: [table] }} / ); }4.3 iframe 嵌入静态 JS SDK示例在 iframe 嵌入场景中entityTypes作为QuestionEmbedOptions的属性传入metabase-question question-id42 entity-types[model, table] is-save-enabledtrue /metabase-question对应地SDK 在初始化时会把该属性写入嵌入设置见 frontend/src/metabase/embedding/embedding-iframe-sdk/constants.ts 中entityTypes被列入可用的嵌入属性键随后经SdkIframeEmbedRoute透传给SdkQuestion组件。五、常见配置组合与注意事项场景entityTypes取值效果开放全部原生数据源[table]用户仅能从物理表开始分析仅开放模型[model]用户只能以受管模型作为数据源适合「先建模型再分发」的治理式嵌入表 模型默认行为[model, table]或省略不传对应DEFAULT_EMBEDDING_ENTITY_TYPES的默认值非法值或空数组如[question]之外的无效字面量、[]被normalizeEntityTypes过滤空结果回退为[model, table]实践建议安全优先若嵌入场景面向外部客户且不希望其接触到原始表结构建议设置entityTypes: [model]配合数据权限Data Permissions实现「只见模型、不见底表」的隔离区分 picker 形态question类型仅在 staged picker 下生效而EntityTypeFilterKeys不含该值因此使用本类型时无需关心这一差异与dataPicker属性配合数据源数量较多≥ 100时 SDK 会自动切换到 staged picker如需统一体验可显式设置dataPickerstaged类型约束由编译期保证EntityTypeFilterKeys是字面量联合类型在 TypeScript 中传入其他字符串会直接产生编译错误这比运行时校验更早地拦截错误配置。六、相关类型与文档索引围绕EntityTypeFilterKeys可在以下仓库路径继续深入类型定义frontend/src/embedding-sdk-bundle/types/question.ts#L170iframe 嵌入选项frontend/src/metabase/embedding/embedding-iframe-sdk/types/embed.ts数据选择器实现frontend/src/metabase/querying/notebook/components/NotebookDataPicker/EmbeddingDataPicker/EmbeddingDataPicker.tsx默认值与校验frontend/src/metabase/redux/embedding-data-picker.tsSDK API 文档入口docs/embedding/sdk/api/index.html相关类型EmbeddingEntityTypedocs/embedding/sdk/api/snippets/EmbeddingEntityType.md、SdkQuestionPropsdocs/embedding/sdk/api/snippets/SdkQuestionProps.md小结EntityTypeFilterKeys虽只有一行定义却是 Metabase 嵌入式分析数据源边界控制的关键类型。通过entityTypes属性宿主应用可以在不修改任何服务端配置的前提下将嵌入环境中的可分析数据源精确限定为「物理表」与「模型」实现从界面层面对数据范围的第一道约束。赞分享数据分析数据可视化后端数据库客户端企业应用【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址https://gitcode.com/GitHub_Trending/me/metabase点击查看免费下载相关推荐NutUI DatePicker 日期选择器全解析类型模式、格式化、过滤与源码实现NutUI DatePicker 日期选择器全解析类型模式、格式化、过滤与源码实现 本指南以 NutUI 移动端组件库京东风格 Vue 组件库中的 Dat前端UI组件OneUptime API 查询过滤器 LessThan 数据类型详解JSON 格式、值类型与序列化实现OneUptime API 查询过滤器 LessThan 数据类型详解JSON 格式、值类型与序列化实现 OneUptime 是一套完整的开源监控与可观测性平可观测性后端运维前端云原生微服务AI AgentMetabase 嵌入 SDK 全局插件配置MetabaseGlobalPluginsConfig 类型详解与实战Metabase 嵌入 SDK 全局插件配置MetabaseGlobalPluginsConfig 类型详解与实战 导读 MetabaseGlobalPlug数据分析数据可视化后端数据库客户端企业应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

工程代码中模糊缩写‘rea‘的溯源与治理方法

工程代码中模糊缩写‘rea‘的溯源与治理方法

项目标题“rea”目前在公开网络环境中未形成明确、稳定、可验证的语义指向。经多平台实时检索(含主流搜索引擎、社交媒体热榜、技术社区、词源数据库及新词监测工具),该字符串未出现在近期权威热词榜单、行业术语库或大众传播语境中&#xff…

2026/10/11 11:23:00 阅读更多 →
Java远程控制源码拆解:Robot抓屏、TCP传输与事件注入

Java远程控制源码拆解:Robot抓屏、TCP传输与事件注入

简介:这是一份面向Java中高级学习者的远程控制源码资源包,围绕RMI与JMX两条技术路线组织,帮助读者理解跨JVM的方法调用、远程对象注册与分布式管理机制。包内共有46个文件,包括4个Java源文件、38个已编译的class文件,以…

2026/10/11 11:22:59 阅读更多 →
Total Uninstall Pro 快照差分机制与批量静默卸载实战指南

Total Uninstall Pro 快照差分机制与批量静默卸载实战指南

简介:这是一款面向Windows用户的专业级软件卸载工具,专门解决系统自带卸载程序、360强力卸载等常规手段无法彻底清除的顽固软件残留问题,尤其适合需要深度清理系统程序、释放磁盘空间或排查卸载故障的进阶用户。压缩包共18个文件,…

2026/10/11 11:22:59 阅读更多 →

最新新闻

Open Science Desktop的ACP协议详解:与Codex、Claude Code、Zed双向互通的原理与实践

Open Science Desktop的ACP协议详解:与Codex、Claude Code、Zed双向互通的原理与实践

【免费下载链接】open-science Open Science Desktop — local-first, model-agnostic AI research workbench for macOS, Windows & Linux. Open-source Claude Science desktop alternative built on Tauri MCP agent skills. 项目地址: https://gitcode.co…

2026/10/11 13:12:50 阅读更多 →
在广东试了十几个背单词小程序,我踩过的坑比你想的深

在广东试了十几个背单词小程序,我踩过的坑比你想的深

先说个背景。我在广州做了四年英语培训,带过的学员从初中生到准备出国的职场人都有。广东背单词小程序品牌这两年冒出来特别多,地铁上、电梯里、短视频里全是广告。我一开始还挺高兴,觉得工具多了是好事。结果真带着学员挨个试下来&#xff0…

2026/10/11 13:12:50 阅读更多 →
把Hope Agent部署成7x24在线的个人服务:Docker自托管NAS/云VPS与远程访问完整教程

把Hope Agent部署成7x24在线的个人服务:Docker自托管NAS/云VPS与远程访问完整教程

【免费下载链接】hope-agent 🦭 A cross-device desktop AI agent with memory, autonomous goals, dynamic workflows, and headless deployment | 会记忆、能持续推进目标、会动态编排多 Agent 的跨端桌面 AI 助手,也可服务化常驻 NAS / 云端 项目地址…

2026/10/11 13:12:50 阅读更多 →
Jmeter接口测试实战:从HTTP基础到参数化、断言与压测

Jmeter接口测试实战:从HTTP基础到参数化、断言与压测

1. 项目概述:接口测试为什么要选Jmeter先开门见山说结论:用Jmeter做HTTP接口测试,是目前中小团队和个人测试最“性价比”的选择之一。你不需要写一段复杂的Java代码,不需要维护一套平台,只要把Jmeter装好,按…

2026/10/11 13:12:50 阅读更多 →
K8s离线部署flannel镜像包全攻略:从拉取到导入避坑

K8s离线部署flannel镜像包全攻略:从拉取到导入避坑

简介:这份资源面向正在搭建 Kubernetes 集群、需要为节点配置网络插件的运维与开发人员,解决 k8s 安装过程中 flannel 网络组件镜像难以获取、离线环境拉取不便的问题。压缩包共 3 个文件,以 2 个 tar 镜像包和 1 个 yaml 清单为主&#xff0…

2026/10/11 13:12:50 阅读更多 →
面对模糊需求如何落地项目?从rea代号拆解到技术选型与实现

面对模糊需求如何落地项目?从rea代号拆解到技术选型与实现

1. 当标题只剩三个字母:一次“信息真空”下的项目复盘拿到“rea”这个标题的时候,我第一反应是愣了一下。没有项目正文,没有关键词,没有摘要描述,连热搜词和网络热词都是空的。换句话说,这是一个几乎零信息…

2026/10/11 13:11:50 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/10 10:38:42 阅读更多 →