数据库导出限制说明
重要提示: 在使用 schema-dsl 导出数据库 Schema 功能时,请仔细阅读本文档,了解哪些特性可以导出,哪些不支持。
📑 目录
核心原则
schema-dsl 的数据库导出功能遵循以下原则:
- ✅ 静态结构优先: 只导出固定的、静态的 Schema 定义
- ❌ 动态逻辑不导出: 运行时条件逻辑、动态计算等无法转换为数据库约束
- ⚠️ 约束映射有限: 数据库原生约束能力有限,部分高级约束会被忽略或简化
- 🎯 类型映射为主: 主要关注类型定义和基础约束(长度、范围、必填等)
不支持导出的特性
以下 schema-dsl 特性无法导出到数据库 Schema(会被忽略):
1. 条件验证逻辑 ❌
dsl.match() - 条件字段映射
原因: 数据库不支持"根据 A 字段值决定 B 字段类型"的动态约束。
替代方案:
- 导出为最宽松的类型(
VARCHAR(255)) - 验证逻辑保留在应用层(使用 schema-dsl 验证器)
dsl.if() - 条件验证
原因: 同上,数据库不支持条件约束。
2. 复杂的 JSON Schema 关键字 ❌
以下 JSON Schema 高级特性无法导出:
示例:
3. 自定义验证器 ❌
原因: 数据库无法执行 JavaScript 函数。
替代方案:
- 使用
pattern正则表达式(如果可表达) - 验证逻辑保留在应用层
4. 自定义错误消息 ❌
导出行为:
- ✅
label()会导出为COMMENT(MySQL/PostgreSQL) - ❌
messages()会被忽略(数据库不存储错误消息)
5. 嵌套对象的深度约束 ⚠️
导出行为:
- MongoDB: ✅ 完整支持嵌套验证
- MySQL: ❌ 导出为
JSON类型,内部约束丢失 - PostgreSQL: ❌ 导出为
JSONB类型,内部约束丢失
部分支持的特性
以下特性在不同数据库中支持程度不同:
1. 正则表达式约束 ⚠️
注意: MySQL 和 PostgreSQL 没有原生的正则约束,需在应用层验证。
2. 数值范围约束 ⚠️
3. 字符串长度约束 ⚠️
4. 枚举约束 ⚠️
5. 数组约束 ⚠️
完全支持的特性
以下特性在所有数据库中都能良好导出:
✅ 基础类型
所有数据库都支持类型映射。
✅ 必填约束
导出为:
- MongoDB:
required: ['email'] - MySQL/PostgreSQL:
NOT NULL/NULL
✅ 默认值(仅 MySQL/PostgreSQL)
导出为:
- MongoDB: ❌ 不支持
default - MySQL/PostgreSQL: ✅
DEFAULT false
✅ 字段描述
导出为:
- MongoDB:
description: "用户登录名" - MySQL:
COMMENT '用户登录名' - PostgreSQL:
COMMENT ON COLUMN ... IS '用户登录名'
数据库特定限制
MongoDB
MySQL
PostgreSQL
最佳实践建议
1. 分层验证策略 🎯
原则:
- 数据库:防止数据损坏的最后一道防线
- 应用层:完整的业务逻辑验证
2. 明确导出前的预期 📋
在使用导出功能前,请先检查 Schema 是否包含不支持的特性:
3. 使用描述说明约束 📝
对于无法导出的约束,使用 description() 在数据库中留下说明:
导出为:
4. 保留完整 Schema 定义 💾
5. 文档化不兼容特性 📖
在项目文档中明确说明哪些验证逻辑在数据库层不生效:
常见问题
Q1: 为什么 dsl.match() 不能导出?
A: 数据库不支持"根据字段 A 的值决定字段 B 的类型"这种动态约束。数据库 Schema 在创建时就固定了,无法运行时改变。
解决方案:
- 导出为最宽松的类型(如
VARCHAR(255)) - 应用层使用完整 Schema 验证
Q2: MySQL 不支持正则,怎么办?
A: MySQL 的 CHECK 约束不支持正则表达式。
解决方案:
- 应用层验证(推荐)
- 使用触发器(不推荐,复杂且难维护)
- 在
COMMENT中说明约束规则
Q3: 嵌套对象导出后丢失约束?
A: MySQL/PostgreSQL 将嵌套对象导出为 JSON/JSONB 类型,内部约束无法表达。
解决方案:
- MongoDB: 完整支持嵌套验证
- MySQL/PostgreSQL: 应用层验证
Q4: 如何检查 Schema 是否适合导出?
A: 以下特性不适合导出:
适合导出的特性:
总结
相关文档
对应示例文件
示例入口: export-limitations.ts
说明: 展示“完整应用层 schema”与“数据库导出专用简化 schema”的分工,以及三类导出器对静态 schema 的落地结果。