新增视图页面与数据库升级

想给平台加一张新表/一个新接口/一个新菜单,并把对应的数据库结构升级上去时,按这篇的 how-to 三步走

二次开发 / 开发指南
新增视图新增页面新增接口菜单注册home.pymenumodelviewMyappModelRestApi数据库升级db upgradedb migratealembic_versionmigrationsversions三步法

新增视图页面与数据库升级

本文聚焦 how-to:在 home.py 注册菜单 + 新增 model/view + 数据库升级三步法。原理性的框架说明见 FAB后端开发框架.md,目录定位见 代码结构与模块地图.md

一、菜单控制

修改 myapp/views/home.py 中的 menu 函数(通过 @expose_api(url='/menu') 暴露为 /menu 接口),在对应位置增加一个接口、外联、iframe,或者 model/view 的 API。

注意:view 里注册的 route_base 要和 menu 函数中 API 类型的 url 相对应。

核实并修正:原文写"menus 函数",源码中函数名为 menu(单数),对外路由 /menu,见 myapp/views/home.py:81-83

二、增加一个 model/view 的 API

myapp/models/ 目录下增加对应的 model 文件,可参考 myapp/models/model_metadata_metric.py

myapp/views/ 目录下增加对应的 view 文件,可参考 myapp/views/view_metadata_metric.py

说明:上述两个参考文件已核实存在。view 一般继承 MyappModelRestApi 并以 appbuilder.add_api(...) 注册,例如 view_metadata_metric.py:191Metadata_metric_ModelView_Api,其 route_base = '/metadata_metric_modelview/api'。要让数据库升级能识别到新 model,该 view 必须最终被 myapp/__init__.py 引入(详见 FAB后端开发框架.md 的"数据库结构升级和回滚")。

原文中这两处使用了指向源码的相对链接(../../myapp/models/...../../myapp/views/...)。由于源码在 docs1 之外,这里改为文字路径,不留断链:直接到仓库 myapp/models/model_metadata_metric.pymyapp/views/view_metadata_metric.py 查看。

三、数据库升级调整

增加完文件后,还需要让数据库中包含 model 中的数据库结构。

注意:不能手动修改数据库结构,若手动修改了,则所有的数据库变更结构都会失效(升级记录不再连贯)。

实现原理——三处记录数据库结构的地方:

  1. 代码中定义的数据结构,主要在 myapp/models/ 中的文件(当前代码侧结构)。
  2. myapp/migrations/versions 中记录的数据结构变更历史(历史所有结构)。
  3. 远程 MySQL 数据库中的当前结构,以及数据库中 alembic_version 表记录的当前应用数据版本号(当前所处的数据库结构版本)。

三步法命令:

myapp db upgrade   # 先将远程数据库升级到当前已记录的最新结构(把 migrations/versions 中的信息应用到 mysql)
myapp db migrate   # 检查数据库相对代码新增/修改了哪些结构(对比 mysql 与代码,把新变更写入 migrations/versions)
myapp db upgrade   # 增量把新的变更结构应用到数据库(把 migrations/versions 中内容应用到 mysql)

说明:本仓库 myapp/migrations/ 下还有 versions-mysqlversions-postgres 两份历史结构。启动时按数据库类型处理 versions(见 install/docker/config.py:476-488):MySQL 直接用默认 versions;PostgreSQL/人大金仓用 versions-postgres 覆盖;达梦清空 versions 并改由 db.create_all() 建表、不走 Alembic。因此 PostgreSQL/达梦等场景下的迁移文件与 MySQL 不同。

最后更新 2026-06-30完整文档以官方仓库为准:GitHub Wiki