Navicat Premium 模型设计器不支持全局变量,无变量声明、作用域或运行时求值机制;所谓“复用”依赖结构化建模与外部协同,如命名规范、注释、虚拟组及导出后脚本替换。Navicat Premium 的模型设计器(如 ER 图、逻辑/物理模型)**不支持定义或使用传统意义上的“全局变量”**,它没有变量声明语法、作用域管理或运行时求值机制。所谓“复用”,实际依赖的是结构化建模能力与外部协同机制,而非编程式变量。
Navicat 模型中不存在 @variable 或 SET 语句生效的上下文
你在 sql 编辑器里写的 set @env = 'prod'; 或 select @env; 在模型设计界面完全无效。模型设计器处理的是元数据(表名、列类型、约束、关系),不是可执行 sql 环境。试图在“表字段默认值”里填 @app_version 会导致保存失败或被当作字面字符串存入。
替代方案:用命名约定 + 注释 + 外部文档统一“逻辑变量”
真正能落地的复用方式是把“变量”转化为可维护的建模习惯:
- 在表或列的
Comment字段写明用途,例如:tenant_id (shared across all SaaS modules) - 对通用字段(如
created_at、status_code)建立标准命名规范,并在团队 Wiki 或 Navicat 的数据字典中统一描述其业务含义和取值范围 - 用 Navicat 的
虚拟组将含相同字段组合的表归类(如“审计字段组”包含created_by,updated_at,is_deleted),便于批量查看和导出 DDL - 若需生成带环境前缀的表名(如
prod_users/dev_users),不要硬编码在模型里,而应在导出 SQL 时用外部脚本做字符串替换
模型导出后,再用脚本注入变量值更可靠
Navicat 支持将模型导出为 SQL(文件 > 导出 > SQL 文件),但导出内容是静态 DDL。想实现动态行为,得靠外部工具链:
- 导出的 SQL 可以用 Python +
jinja2模板渲染,把{{ schema_prefix }}替换为实际值 - 配合 CI 流程,在部署前用 sed 或 PowerShell 批量替换占位符,例如将
__ENV__替换为staging - Navicat 自身不提供“模板变量”功能,别在“模型属性”或“连接设置”里找类似选项——它根本不存在











