schema-dsl 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +10 -0
- package/.eslintrc.json +27 -0
- package/.github/CODE_OF_CONDUCT.md +45 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +57 -0
- package/.github/ISSUE_TEMPLATE/config.yml +11 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +45 -0
- package/.github/ISSUE_TEMPLATE/question.md +31 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +70 -0
- package/.github/SECURITY.md +184 -0
- package/.github/workflows/ci.yml +35 -0
- package/CHANGELOG.md +633 -0
- package/CONTRIBUTING.md +368 -0
- package/LICENSE +21 -0
- package/README.md +1122 -0
- package/STATUS.md +273 -0
- package/docs/FEATURE-INDEX.md +521 -0
- package/docs/INDEX.md +224 -0
- package/docs/api-reference.md +1098 -0
- package/docs/best-practices.md +672 -0
- package/docs/cache-manager.md +336 -0
- package/docs/design-philosophy.md +602 -0
- package/docs/dsl-syntax.md +654 -0
- package/docs/dynamic-locale.md +552 -0
- package/docs/error-handling.md +703 -0
- package/docs/export-guide.md +459 -0
- package/docs/faq.md +576 -0
- package/docs/frontend-i18n-guide.md +290 -0
- package/docs/i18n-user-guide.md +488 -0
- package/docs/label-vs-description.md +262 -0
- package/docs/markdown-exporter.md +398 -0
- package/docs/mongodb-exporter.md +279 -0
- package/docs/multi-type-support.md +319 -0
- package/docs/mysql-exporter.md +257 -0
- package/docs/plugin-system.md +542 -0
- package/docs/postgresql-exporter.md +290 -0
- package/docs/quick-start.md +761 -0
- package/docs/schema-helper.md +340 -0
- package/docs/schema-utils.md +492 -0
- package/docs/string-extensions.md +480 -0
- package/docs/troubleshooting.md +471 -0
- package/docs/type-converter.md +319 -0
- package/docs/type-reference.md +219 -0
- package/docs/validate.md +486 -0
- package/docs/validation-guide.md +484 -0
- package/examples/array-dsl-example.js +227 -0
- package/examples/custom-extension.js +85 -0
- package/examples/dsl-match-example.js +74 -0
- package/examples/dsl-style.js +118 -0
- package/examples/dynamic-locale-configuration.js +348 -0
- package/examples/dynamic-locale-example.js +287 -0
- package/examples/export-demo.js +130 -0
- package/examples/i18n-full-demo.js +310 -0
- package/examples/i18n-memory-safety.examples.js +268 -0
- package/examples/markdown-export.js +71 -0
- package/examples/middleware-usage.js +93 -0
- package/examples/password-reset/README.md +153 -0
- package/examples/password-reset/schema.js +26 -0
- package/examples/password-reset/test.js +101 -0
- package/examples/plugin-system.examples.js +205 -0
- package/examples/simple-example.js +122 -0
- package/examples/string-extensions.js +297 -0
- package/examples/user-registration/README.md +156 -0
- package/examples/user-registration/routes.js +92 -0
- package/examples/user-registration/schema.js +150 -0
- package/examples/user-registration/server.js +74 -0
- package/index.d.ts +1999 -0
- package/index.js +270 -0
- package/index.mjs +30 -0
- package/lib/adapters/DslAdapter.js +653 -0
- package/lib/adapters/index.js +20 -0
- package/lib/config/constants.js +286 -0
- package/lib/config/patterns/creditCard.js +9 -0
- package/lib/config/patterns/idCard.js +9 -0
- package/lib/config/patterns/index.js +8 -0
- package/lib/config/patterns/licensePlate.js +4 -0
- package/lib/config/patterns/passport.js +4 -0
- package/lib/config/patterns/phone.js +9 -0
- package/lib/config/patterns/postalCode.js +5 -0
- package/lib/core/CacheManager.js +376 -0
- package/lib/core/DslBuilder.js +740 -0
- package/lib/core/ErrorCodes.js +233 -0
- package/lib/core/ErrorFormatter.js +342 -0
- package/lib/core/JSONSchemaCore.js +347 -0
- package/lib/core/Locale.js +119 -0
- package/lib/core/MessageTemplate.js +89 -0
- package/lib/core/PluginManager.js +448 -0
- package/lib/core/StringExtensions.js +209 -0
- package/lib/core/Validator.js +316 -0
- package/lib/exporters/MarkdownExporter.js +420 -0
- package/lib/exporters/MongoDBExporter.js +162 -0
- package/lib/exporters/MySQLExporter.js +212 -0
- package/lib/exporters/PostgreSQLExporter.js +289 -0
- package/lib/exporters/index.js +24 -0
- package/lib/locales/en-US.js +65 -0
- package/lib/locales/es-ES.js +66 -0
- package/lib/locales/fr-FR.js +66 -0
- package/lib/locales/index.js +8 -0
- package/lib/locales/ja-JP.js +66 -0
- package/lib/locales/zh-CN.js +93 -0
- package/lib/utils/LRUCache.js +174 -0
- package/lib/utils/SchemaHelper.js +240 -0
- package/lib/utils/SchemaUtils.js +313 -0
- package/lib/utils/TypeConverter.js +245 -0
- package/lib/utils/index.js +13 -0
- package/lib/validators/CustomKeywords.js +203 -0
- package/lib/validators/index.js +11 -0
- package/package.json +70 -0
- package/plugins/custom-format.js +101 -0
- package/plugins/custom-validator.js +200 -0
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# MySQL 导出器文档
|
|
2
|
+
|
|
3
|
+
> **模块**: `lib/exporters/MySQLExporter.js`
|
|
4
|
+
|
|
5
|
+
> **用途**: 将 JSON Schema 转换为 MySQL CREATE TABLE 语句
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 📑 目录
|
|
10
|
+
|
|
11
|
+
- [概述](#概述)
|
|
12
|
+
- [快速开始](#快速开始)
|
|
13
|
+
- [API 参考](#api-参考)
|
|
14
|
+
- [配置选项](#配置选项)
|
|
15
|
+
- [完整示例](#完整示例)
|
|
16
|
+
- [类型映射](#类型映射)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 概述
|
|
21
|
+
|
|
22
|
+
`MySQLExporter` 将 SchemaIO 生成的 JSON Schema 转换为 MySQL 的 DDL 语句,包括 `CREATE TABLE` 和索引创建语句。
|
|
23
|
+
|
|
24
|
+
### 核心功能
|
|
25
|
+
|
|
26
|
+
- ✅ 生成 `CREATE TABLE` DDL 语句
|
|
27
|
+
- ✅ 自动类型映射(JSON Schema → MySQL)
|
|
28
|
+
- ✅ 支持 NOT NULL、DEFAULT、COMMENT
|
|
29
|
+
- ✅ 自动检测主键
|
|
30
|
+
- ✅ 生成索引 DDL
|
|
31
|
+
- ✅ 可配置存储引擎和字符集
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 快速开始
|
|
36
|
+
|
|
37
|
+
```javascript
|
|
38
|
+
const { dsl, exporters } = require('schema-dsl');
|
|
39
|
+
|
|
40
|
+
// 1. 定义 Schema
|
|
41
|
+
const userSchema = dsl({
|
|
42
|
+
id: 'string!',
|
|
43
|
+
username: 'string:3-32!',
|
|
44
|
+
email: 'email!',
|
|
45
|
+
age: 'number:18-120',
|
|
46
|
+
status: 'active|inactive'
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// 2. 创建导出器
|
|
50
|
+
const exporter = new exporters.MySQLExporter();
|
|
51
|
+
|
|
52
|
+
// 3. 导出为 MySQL DDL
|
|
53
|
+
const ddl = exporter.export('users', userSchema);
|
|
54
|
+
console.log(ddl);
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**输出**:
|
|
58
|
+
|
|
59
|
+
```sql
|
|
60
|
+
CREATE TABLE `users` (
|
|
61
|
+
`id` VARCHAR(255) NOT NULL,
|
|
62
|
+
`username` VARCHAR(32) NOT NULL,
|
|
63
|
+
`email` VARCHAR(255) NOT NULL,
|
|
64
|
+
`age` DOUBLE NULL,
|
|
65
|
+
`status` VARCHAR(255) NULL,
|
|
66
|
+
PRIMARY KEY (`id`)
|
|
67
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## API 参考
|
|
73
|
+
|
|
74
|
+
### 构造函数
|
|
75
|
+
|
|
76
|
+
```javascript
|
|
77
|
+
new MySQLExporter(options)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**参数**:
|
|
81
|
+
|
|
82
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
83
|
+
|------|------|--------|------|
|
|
84
|
+
| `options.engine` | string | `'InnoDB'` | 存储引擎 |
|
|
85
|
+
| `options.charset` | string | `'utf8mb4'` | 字符集 |
|
|
86
|
+
| `options.collate` | string | `'utf8mb4_unicode_ci'` | 排序规则 |
|
|
87
|
+
|
|
88
|
+
### 方法
|
|
89
|
+
|
|
90
|
+
#### `export(tableName, jsonSchema)`
|
|
91
|
+
|
|
92
|
+
生成 MySQL CREATE TABLE 语句。
|
|
93
|
+
|
|
94
|
+
```javascript
|
|
95
|
+
const ddl = exporter.export('users', userSchema);
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**参数**:
|
|
99
|
+
- `tableName` (string): 表名
|
|
100
|
+
- `jsonSchema` (Object): JSON Schema 对象(必须是 object 类型)
|
|
101
|
+
|
|
102
|
+
**返回值**:
|
|
103
|
+
- `string`: MySQL DDL 语句
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
#### `generateIndex(tableName, columnName, options)`
|
|
108
|
+
|
|
109
|
+
生成索引创建语句。
|
|
110
|
+
|
|
111
|
+
```javascript
|
|
112
|
+
const indexDdl = exporter.generateIndex('users', 'email', { unique: true });
|
|
113
|
+
console.log(indexDdl);
|
|
114
|
+
// CREATE UNIQUE INDEX `idx_users_email` ON `users` (`email`);
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**参数**:
|
|
118
|
+
- `tableName` (string): 表名
|
|
119
|
+
- `columnName` (string): 列名
|
|
120
|
+
- `options.name` (string): 索引名(可选,默认 `idx_表名_列名`)
|
|
121
|
+
- `options.unique` (boolean): 是否唯一索引(默认 false)
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
#### `MySQLExporter.export(tableName, jsonSchema)` (静态方法)
|
|
126
|
+
|
|
127
|
+
快速导出,无需实例化。
|
|
128
|
+
|
|
129
|
+
```javascript
|
|
130
|
+
const ddl = exporters.MySQLExporter.export('users', userSchema);
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 配置选项
|
|
136
|
+
|
|
137
|
+
### 存储引擎
|
|
138
|
+
|
|
139
|
+
```javascript
|
|
140
|
+
// 使用 MyISAM 引擎
|
|
141
|
+
const exporter = new exporters.MySQLExporter({
|
|
142
|
+
engine: 'MyISAM'
|
|
143
|
+
});
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### 字符集配置
|
|
147
|
+
|
|
148
|
+
```javascript
|
|
149
|
+
// 使用 utf8 字符集
|
|
150
|
+
const exporter = new exporters.MySQLExporter({
|
|
151
|
+
charset: 'utf8',
|
|
152
|
+
collate: 'utf8_general_ci'
|
|
153
|
+
});
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 完整示例
|
|
159
|
+
|
|
160
|
+
### 用户表 DDL 生成
|
|
161
|
+
|
|
162
|
+
```javascript
|
|
163
|
+
const { dsl, exporters } = require('schema-dsl');
|
|
164
|
+
|
|
165
|
+
// 定义用户 Schema(带描述)
|
|
166
|
+
const userSchema = dsl({
|
|
167
|
+
id: 'string!',
|
|
168
|
+
username: 'string:3-32!'
|
|
169
|
+
.description('用户登录名'),
|
|
170
|
+
email: 'email!'
|
|
171
|
+
.description('用户邮箱'),
|
|
172
|
+
password: 'string:8-64!',
|
|
173
|
+
age: 'number:0-150',
|
|
174
|
+
status: 'active|inactive|banned',
|
|
175
|
+
createdAt: 'datetime!'
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
// 生成 DDL
|
|
179
|
+
const exporter = new exporters.MySQLExporter();
|
|
180
|
+
const ddl = exporter.export('users', userSchema);
|
|
181
|
+
|
|
182
|
+
console.log(ddl);
|
|
183
|
+
|
|
184
|
+
// 生成索引
|
|
185
|
+
console.log(exporter.generateIndex('users', 'email', { unique: true }));
|
|
186
|
+
console.log(exporter.generateIndex('users', 'username', { unique: true }));
|
|
187
|
+
console.log(exporter.generateIndex('users', 'status'));
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**输出**:
|
|
191
|
+
|
|
192
|
+
```sql
|
|
193
|
+
CREATE TABLE `users` (
|
|
194
|
+
`id` VARCHAR(255) NOT NULL,
|
|
195
|
+
`username` VARCHAR(32) NOT NULL COMMENT '用户登录名',
|
|
196
|
+
`email` VARCHAR(255) NOT NULL COMMENT '用户邮箱',
|
|
197
|
+
`password` VARCHAR(64) NOT NULL,
|
|
198
|
+
`age` DOUBLE NULL,
|
|
199
|
+
`status` VARCHAR(255) NULL,
|
|
200
|
+
`createdAt` DATETIME NOT NULL,
|
|
201
|
+
PRIMARY KEY (`id`)
|
|
202
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
203
|
+
|
|
204
|
+
CREATE UNIQUE INDEX `idx_users_email` ON `users` (`email`);
|
|
205
|
+
CREATE UNIQUE INDEX `idx_users_username` ON `users` (`username`);
|
|
206
|
+
CREATE INDEX `idx_users_status` ON `users` (`status`);
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 类型映射
|
|
212
|
+
|
|
213
|
+
| JSON Schema 类型 | 格式/约束 | MySQL 类型 |
|
|
214
|
+
|------------------|-----------|------------|
|
|
215
|
+
| `string` | - | `VARCHAR(255)` |
|
|
216
|
+
| `string` | `maxLength: 50` | `VARCHAR(50)` |
|
|
217
|
+
| `string` | `maxLength: 500` | `TEXT` |
|
|
218
|
+
| `string` | `format: email` | `VARCHAR(255)` |
|
|
219
|
+
| `string` | `format: date-time` | `DATETIME` |
|
|
220
|
+
| `integer` | `maximum: 127` | `TINYINT` |
|
|
221
|
+
| `integer` | `maximum: 32767` | `SMALLINT` |
|
|
222
|
+
| `integer` | `maximum: 2147483647` | `INT` |
|
|
223
|
+
| `integer` | - | `BIGINT` |
|
|
224
|
+
| `number` | - | `DOUBLE` |
|
|
225
|
+
| `boolean` | - | `BOOLEAN` |
|
|
226
|
+
| `object` | - | `JSON` |
|
|
227
|
+
| `array` | - | `JSON` |
|
|
228
|
+
|
|
229
|
+
### 约束映射
|
|
230
|
+
|
|
231
|
+
| 约束 | MySQL 处理 |
|
|
232
|
+
|------|-----------|
|
|
233
|
+
| `required` | `NOT NULL` |
|
|
234
|
+
| 非 required | `NULL` |
|
|
235
|
+
| `default` | `DEFAULT value` |
|
|
236
|
+
| `description` | `COMMENT 'text'` |
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 主键检测
|
|
241
|
+
|
|
242
|
+
导出器会自动检测以下字段作为主键:
|
|
243
|
+
|
|
244
|
+
1. 名为 `id` 的字段
|
|
245
|
+
2. 名为 `_id` 的字段
|
|
246
|
+
|
|
247
|
+
如果存在这些字段,会自动添加 `PRIMARY KEY` 约束。
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## 相关文档
|
|
252
|
+
|
|
253
|
+
- [数据库导出指南](export-guide.md)
|
|
254
|
+
- [MongoDB 导出器](mongodb-exporter.md)
|
|
255
|
+
- [PostgreSQL 导出器](postgresql-exporter.md)
|
|
256
|
+
- [TypeConverter](type-converter.md)
|
|
257
|
+
|