ARTICLE DETAIL

资讯详情

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

NocoBase 数据库视图连接实战:将已有 SQL 视图接入 NocoBase 数据源

NocoBase 数据库视图连接实战:将已有 SQL 视图接入 NocoBase 数据源 NocoBase 数据库视图连接实战将已有 SQL 视图接入 NocoBase 数据源【免费下载链接】nocobaseNocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobase本文围绕 NocoBase 的「连接数据库视图」Collection View能力展开讲解如何在主数据源中把数据库里已定义的普通视图接入为数据表完成字段映射、记录唯一标识、增删改权限与字段同步等完整配置。读完本文你将掌握数据库视图数据表的接入流程、字段推断机制的源码原理以及视图字段在 NocoBase 中如何映射为 Field type 与 Field interface。适用场景与能力边界数据库视图view常用于复用数据库侧已经写好的查询逻辑典型例子包括DBA 维护的财务报表视图过滤后的客户视图跨系统同步后的聚合视图。NocoBase 支持把这类视图直接接入为主数据源中的「数据库视图数据表」在界面上配置字段与展示实现复杂查询结果的可视化管理。需要注意以下能力边界仅支持主数据库连接账号所有者范围内的普通视图不支持物化视图即使该账号对其他所有者的视图有查询权限这些视图也不会出现在可连接列表中连接前应确认视图字段有稳定的列名且字段类型能被 NocoBase 识别。从源码结构看可连接视图列表由 dbViews 资源器 的list动作生成它通过db.queryInterface.listViews读取数据库中真实存在的视图再过滤掉已经被isView()数据表连接的视图避免同一个视图被重复接入。连接数据库视图的操作步骤连接视图的操作入口在数据源管理界面中点击系统功能中的「数据源」菜单访问数据源主页在数据源列表中选择Main数据源点击「Configure」操作访问主数据库在主数据库管理中点击「Create collection」选择「Connect to database view」。进入配置页后需要确认下表所列的各项配置配置说明Collection display name数据库视图在界面中显示的名称比如「财务报表视图」「客户统计视图」。建议使用能说明视图用途的名称。Collection name数据库视图在 NocoBase 中的标识名称用于 API、关系字段、权限、工作流等内部引用。它会自动生成也可以手动修改只支持字母、数字和下划线并且必须以字母开头。Database view选择要连接的数据库视图。从视图中读取字段结构和查询结果。编辑时可以查看当前连接的 view但不能切换为另一个 view。Categories数据表分类。只影响数据表管理界面的组织方式不改变数据库视图本身。Description数据表说明。建议写清楚这个 view 由谁维护、查询了哪些数据、用于哪些页面或报表。Use simple pagination mode简单分页模式。启用后表格区块分页时会跳过总记录数统计适合数据量大的视图可以减少查询压力。Record unique key记录唯一标识。数据库视图通常没有主键需要选择一个能唯一定位记录的字段否则可能无法在区块中正确查看或编辑记录。Source collections数据库视图的字段来源。用于把视图字段和已有数据表字段关联起来帮助 NocoBase 识别字段类型和界面类型。Fields字段映射配置。用于确认视图中每个字段的名称、标题、数据类型和界面类型。Preview预览数据库视图结果。提交前可以先确认字段映射和展示效果是否符合预期。Allow add new, update and delete actions是否允许对数据库视图执行新增、更新和删除。启用后NocoBase 会在页面中开放对应操作入口是否能写入成功仍取决于数据库 view 本身是否可写以及数据库账号是否有 insert、update 和 delete 权限。其中Source collections是根据数据库视图推断出的来源数据表它识别 view 里的字段主要来自哪些已有数据表并在字段映射时限定可选的Field source。由于推断结果仅用于辅助快速配置如果 view 中存在字段重命名、计算、聚合或复杂 join结果可能不完全准确甚至无法推断需要在Fields中手动确认。字段映射NocoBase 如何推断视图字段字段映射是连接数据库视图后必须确认的配置。连接 view 后NocoBase 会先推断每个视图字段的来源和数据库类型能推断到来源字段时自动带出已有字段的 Field type、Field interface 和 Field display name不能推断时根据数据库字段类型给出初始 Field type需要手动确认字段类型和界面配置。配置说明Field source选择视图字段来自哪个已有数据表和字段。选中来源后NocoBase 可以复用原字段的 Field type 和 Field interface。Field type如果视图字段没有明确来源需要手动确认字段的数据类型。Field interface确认字段在页面中如何展示和输入比如单行文本、数字、日期、下拉选项。Field display name字段在界面中显示的名称。建议使用业务人员能理解的名称。举例来说如果视图里返回customer_name并且它来自客户表的「客户名称」字段可以把它映射到客户表对应字段这样 NocoBase 就能沿用原字段的标题、类型和界面配置。如果视图字段来自聚合或计算结果比如count(*) as total、sum(amount) as amount_total通常只能手动选择 Field type 和合适的 Field interface。关于更多字段配置信息可参考 字段配置文档。推断机制的源码实现字段推断的底层实现在 ViewFieldInference 类中inferFields方法的工作流程如下调用db.sequelize.getQueryInterface().describeTable读取视图的列结构与数据库类型调用db.queryInterface.viewColumnUsage获取每个视图列对应的来源表和来源列这一能力依赖数据库系统元数据PostgreSQL 下会携带 schema 信息其他方言会忽略 schema 参数对每个视图列做两级推断先通过db.tableNameCollectionMap把「schema.table」解析为 NocoBase 中的 Collection再在rawAttributes中按field数据库列名匹配出来源字段若能匹配到interface配置则直接复用来源字段的type与interface并记录source为「collectionName.fieldName」若来源列恰好是某个BelongsTo关联的外键还会额外推导出一个belongsTo类型字段使视图可以直接建立多对一关联这一行为在 view collection 测试 中有专门用例验证对推断不到类型的列调用inferToFieldType按数据库方言dialect查 FieldTypeMap 把数据库类型如string、integer、decimal、boolean、datetime映射为 NocoBase 字段类型映射结果可能是数组此时取第一个作为推荐类型并保留possibleTypes。推断结果在接口层的出口是 dbViews 资源器的get动作它把推断出的字段拆成「可识别字段」与unsupportedFields无法识别类型的字段并按source去重汇总出sources即界面中的 Source collections。这也解释了为什么文档提示含字段重命名、计算、聚合或复杂 join 的视图推断结果可能不准确需要在 Fields 中手动确认。推断逻辑的单元测试见 view-inference.test.ts。记录唯一标识Record unique key数据库视图需要配置 Record unique key否则无法在页面中创建区块、无法正确查看或编辑记录。支持选择一个字段或多个字段组合作为唯一标识。适合作为 Record unique key 的字段通常满足这些条件字段值唯一字段值稳定不会因为排序、分页或统计口径变化而变化字段不为空字段在 view 中始终返回。选择策略上如果 view 来自单表查询可以优先返回原表主键如果 view 来自多表 join 或聚合可以在数据库视图中保留一个稳定的业务 ID或由数据库侧生成稳定的唯一字段。从源码结构看主键有特殊处理逻辑CollectionModel.loadFields 中当数据表标记为view且字段包含id时会强制把id字段设为主键、其余主键字段全部置为 false对应测试用例 should use id field as only primary key。因此当视图返回了id列时它在 NocoBase 内部会被视为唯一的主键列。允许增删改操作如果数据库 view 支持写入可以启用「Allow add new, update and delete actions」。NocoBase 会在页面中允许对这个视图执行新增、更新和删除操作。数据库视图更适合作为查询结果使用默认按只读数据表处理。只有当你已经确认数据库 view 支持对应写入操作并且数据库权限也允许写入时才建议启用——是否能写入成功最终取决于数据库 view 本身的可写性和数据库账号的 insert、update、delete 权限。预览视图结果提交前可以先使用 Preview 查看视图查询结果。从源码看预览由 dbViews 资源器的query动作 实现它执行带LIMIT/OFFSET的分页SELECT *查询默认每页 10 条如果前端传入了fieldTypes还会对每条记录按对应字段类型的get方法做一次转换使预览展示与字段类型声明后的渲染效果一致。预览时重点确认view 是否能正常查询字段是否完整字段类型和界面类型是否符合业务含义Record unique key 是否存在并且数据唯一不支持的字段类型是否需要在数据库侧调整。配置视图字段数据库视图创建后在数据表列表中点击视图右侧的「Configure fields」即可进入字段配置页面。字段配置用于维护视图有哪些字段、字段在界面中如何显示以及数据库 view 字段如何映射为 NocoBase 的 Field type 和 Field interface。核心约束是数据库视图的普通字段来自数据库 viewNocoBase 不会在 view 中直接新增、修改或删除真实列。在字段配置页中只支持新增多对一关系字段用来补充 NocoBase 中的业务关联数据库视图不支持作为关系字段的目标数据表标题字段通常不需要配置。更多字段配置信息可参考 字段配置文档。新增多对一关系字段数据库视图只能新增多对一关系字段。多对一关系字段可以把 view 中已有字段映射到目标数据表的主键或唯一字段用于在页面中展示关联记录但不会在数据库 view 中创建真实字段或外键约束。点击「Add field」即可新增配置项如下配置说明Field display name多对一关系字段在界面中显示的名称。建议使用业务人员能理解的名称比如「所属客户」「关联订单」。Field name多对一关系字段在 NocoBase 中保存的标识名称用于 API、权限、工作流等内部引用。Source collection源数据表也就是当前数据库视图数据表。用于确定Foreign key从哪个数据表字段中选择数据库视图新增多对一关系字段时通常保持为当前 view。Target collection要关联的目标数据表。通常选择普通数据表、外部数据库表等真实数据表不能选择数据库视图。Foreign key当前数据库视图中用于保存目标记录标识的字段。这个字段需要在 view 查询结果中稳定返回。Target key目标数据表中被Foreign key匹配的字段通常选择主键或唯一字段。Description字段说明。适合写关联关系含义、数据来源、维护方式或注意事项。这一能力与推断逻辑相呼应前文提到的ViewFieldInference在识别到外键列时会直接推断出belongsTo字段而手动新增的多对一关系字段则是对推断结果的补充与修正。调整字段映射数据库视图连接后NocoBase 会根据 view 字段和来源字段推断 Field type并匹配一个默认 Field interface。如果字段来源、展示方式或业务含义不符合预期可以在字段配置中调整映射。这里需要区分两个概念Field interface界面类型 / UI 类型决定字段在前端如何展示和交互比如「单行文本」「数字」「下拉菜单」「日期时间」等它是用户视角的字段分类Field type数据类型决定 NocoBase 如何识别字段的数据类型。没有来源字段的 view 字段通常由数据库字段类型推断比如string、integer、decimal、boolean、datetime等。需要注意调整 Field source、Field type 或 Field interface 不等于修改数据库 view 的字段类型它主要影响页面展示方式、校验规则以及 NocoBase 对字段的识别方式。从数据库同步如果数据库侧修改了 view 字段结构可以进入「Configure fields」点击「Sync from database」重新读取字段结构。同步后NocoBase 会更新字段新增 view 中出现的新字段清理 view 中已经删除的字段并重新确认字段类型和字段来源。特别需要注意字段重命名在同步时通常会表现为「删除旧字段 新增新字段」。同步前先确认旧字段是否已经被页面、权限、工作流或外部 API 使用避免同步后出现配置失效同步后还需要重新检查 Field type 和 Field interface。编辑字段点击字段右侧的「Edit」可以编辑字段配置。编辑字段适合调整字段在 NocoBase 中的展示和使用方式比如修改显示名称、描述、校验规则或字段专属配置。需要注意编辑字段配置不会修改数据库 view 中的真实列名、字段类型、SQL 表达式或索引。如果需要调整 view 的真实结构请先在数据库侧修改 view再使用「Sync from database」同步。删除字段点击字段右侧的「Delete」可以删除单个字段。删除字段只会移除 NocoBase 中保存的字段不会删除数据库 view 的真实列。删除前需要确认字段可能影响页面区块、筛选条件、排序、权限、工作流、API 和已有配置。另外如果数据库 view 中仍然返回这个列后续执行「Sync from database」时NocoBase 可能会再次识别到这个字段。编辑视图元信息数据库视图的 SQL 定义由数据库侧维护。在数据表列表中点击某个数据库视图右侧的「Edit」用于调整数据库视图在 NocoBase 中的元信息和运行配置不会修改数据库里的 view。如果需要连接另一个数据库 view建议新建一个数据库视图数据表。配置说明Collection display name数据库视图在界面中显示的名称。可以改成业务人员能理解的名称比如「财务报表视图」「客户统计视图」。Collection name数据库视图在 NocoBase 中的标识名称。编辑时不可修改。Database view当前连接的数据库 view。编辑时只读不能切换为另一个 view。Categories数据表分类。只影响数据源管理界面的组织方式不改变数据库 view。Description数据表说明。适合写 view 的维护人、查询来源、使用页面或报表用途。Use simple pagination mode简单分页模式。启用后表格区块分页时会跳过总记录数统计适合数据量较大的 view。Record unique key记录唯一标识。用于定位一条记录通常选择 view 中稳定唯一的字段或字段组合。Allow add new, update and delete actions是否允许新增、更新和删除。只有当数据库 view 本身支持写入并且数据库账号有对应权限时才建议启用。修改 Record unique key 或 Allow add new, update and delete actions 后需要重新检查页面区块、权限和工作流是否仍然符合预期。删除视图数据表在数据表列表中点击数据库视图右侧的「Delete」可以删除数据库视图数据表。删除数据库视图数据表只会删除 NocoBase 中的连接配置和字段不会删除数据库里的 view。主数据库中的数据库视图也支持批量选择后统一删除。删除前需要检查页面区块、图表、权限、工作流和外部 API 是否还在使用这个数据库视图数据表。从实现层面看CollectionModel.remove 在删除视图数据表时会先清理所有以该表为target、through或collectionName的关联字段再调用collection.removeFromDb移除元数据因此数据库侧的 view 定义不受影响。小结NocoBase 的数据库视图连接能力本质上是「元数据层接入」数据库侧负责 view 的 SQL 定义与维护NocoBase 侧通过字段推断ViewFieldInference、字段映射Field source / Field type / Field interface、记录唯一标识和可写性开关把只读或可写的查询结果组织成可管理、可展示、可关联的数据表。实践上建议遵循三条原则先推断、后确认利用自动推断带出字段类型与界面类型对聚合、计算类字段手动校准稳定唯一键是前提没有可靠 Record unique key 的视图不适合进入页面区块使用变更走数据库侧结构变更一律先改 view再用「Sync from database」同步避免在 NocoBase 侧做无效的字段编辑。相关代码与测试入口views 资源器、字段推断实现、视图数据表模型、视图集合测试、推断逻辑测试。【免费下载链接】nocobaseNocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表