新增视图页面与数据库升级
本文聚焦 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:191的Metadata_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.py、myapp/views/view_metadata_metric.py查看。
三、数据库升级调整
增加完文件后,还需要让数据库中包含 model 中的数据库结构。
注意:不能手动修改数据库结构,若手动修改了,则所有的数据库变更结构都会失效(升级记录不再连贯)。
实现原理——三处记录数据库结构的地方:
- 代码中定义的数据结构,主要在
myapp/models/中的文件(当前代码侧结构)。 myapp/migrations/versions中记录的数据结构变更历史(历史所有结构)。- 远程 MySQL 数据库中的当前结构,以及数据库中
alembic_version表记录的当前应用数据版本号(当前所处的数据库结构版本)。
三步法命令:
myapp db upgrade # 先将远程数据库升级到当前已记录的最新结构(把 migrations/versions 中的信息应用到 mysql)
myapp db migrate # 检查数据库相对代码新增/修改了哪些结构(对比 mysql 与代码,把新变更写入 migrations/versions)
myapp db upgrade # 增量把新的变更结构应用到数据库(把 migrations/versions 中内容应用到 mysql)
说明:本仓库
myapp/migrations/下还有versions-mysql、versions-postgres两份历史结构。启动时按数据库类型处理versions(见install/docker/config.py:476-488):MySQL 直接用默认versions;PostgreSQL/人大金仓用versions-postgres覆盖;达梦清空versions并改由db.create_all()建表、不走 Alembic。因此 PostgreSQL/达梦等场景下的迁移文件与 MySQL 不同。