Skip to content

导出SQL

FcDesigner 支持根据当前表单字段自动生成数据表建表 SQL,也可对比历史建表语句生成 schema 变更 SQL。适用于把设计好的表单快速落到数据库表结构。

在设计器中生成

2.png

打开预览弹窗,切换到 生成SQL 标签页,即可查看当前表单对应的建表语句,并可直接复制使用。

若业务场景不需要该入口,可通过 config.showPreviewSql = false 隐藏「生成SQL」标签页,详见功能模块显隐

生成结果以 MySQL 风格输出,默认使用 InnoDButf8mb4

通过 API 获取

getSQL

获取当前表单对应的建表 SQL 列表。

js
const tables = designer.value.getSQL();
// [
//   { name: 'order_form', sql: 'CREATE TABLE `order_form` (...)' },
//   { name: 'order_form_items', sql: 'CREATE TABLE `order_form_items` (...)' },
// ]

返回值类型:

ts
interface SqlTable {
    /** 数据表名称 */
    name: string;
    /** 建表 SQL */
    sql: string;
}

getSQLDiff

对比历史建表 SQL 与当前表单,生成 schema 变更语句(CREATE / ALTER / DROP)。

js
// 不传参数时,会与设计器内部缓存的历史建表 SQL 对比
const alters = designer.value.getSQLDiff();

// 也可手动传入历史建表 SQL
const alters2 = designer.value.getSQLDiff(oldSqlTables);

返回值类型:

ts
type SqlAlterAction =
    | 'createTable'
    | 'dropTable'
    | 'addColumn'
    | 'dropColumn'
    | 'modifyColumn'
    | 'renameColumn';

    interface SqlAlter {
    /** 数据表名称 */
    name: string;
    /** 变更类型 */
    action: SqlAlterAction;
    /** 字段名称 */
    field?: string;
    /** 变更 SQL */
    sql: string;
}

使用建议:

  • 首次加载表单规则后,设计器会缓存一份建表 SQL,作为后续对比的基准。
  • 业务侧也可以自行保存 getSQL() 的结果,下次调用 getSQLDiff(oldSql) 时传入,用于生成升级脚本。

表名与字段规则

主表名称

优先使用表单配置中的「表单名称」生成表名;未配置时默认使用 fc_form。表名会自动清洗为合法标识(仅保留字母、数字、下划线和中文)。

系统字段

每张表都会自动包含:

字段说明
id主键,自增
parent_id仅子表存在,用于关联主表 id

字段注释

字段注释会写入组件标题,并附带组件内部标识,便于后续对比时识别字段重命名、类型调整等变更。

字段类型映射

内置组件会按值类型自动映射到 SQL 列类型。常见映射如下:

逻辑类型SQL 类型典型组件场景
stringVARCHAR(255)输入框、单选、单选下拉等
textTEXT富文本等长文本
numberINT计数器、评分等整数
floatDOUBLE浮点数
decimalDECIMAL(p,s)带精度的金额/小数,默认 DECIMAL(10,2)
dateTIMESTAMP日期、日期时间
booleanTINYINT(1)开关(布尔值)
arrayJSON多选、区间、子表单数组等
objectJSON对象结构数据

部分组件会按属性动态决定类型,例如:

  • 下拉多选 → array
  • 日期区间 / 多个日期 → array
  • 开关的开关值不是布尔时 → 按具体值类型映射为 numberstring
  • 计数器配置了小数精度 → decimal

子表单与多表

当表单中包含子表单、表格表单等容器,并且内部已有字段时,会额外生成子表:

  • 主表仍会保留该子表单字段(类型为 arrayobject
  • 子表名默认为 {主表名}_{字段名}
  • 子表自动增加 parent_id 字段,用于关联主表

例如主表 order_form 中有明细字段 items,会额外生成 order_form_items

自定义组件字段类型

扩展拖拽组件时,可通过 DragRule.sqlType 指定生成 SQL 时的字段类型。

js
const InputDragRule = {
    name: 'customInput',
    label: '自定义输入',
    // ...
    // 固定类型
    sqlType: 'string',
    // 或按规则动态返回
    // sqlType: (rule) => rule.props?.multiple ? 'array' : 'string',
    // 或指定小数精度
    // sqlType: { type: 'decimal', precision: 12, scale: 2 },
};

sqlType 支持以下取值:

ts
type SqlTypeName =
    | 'string'
    | 'text'
    | 'float'
    | 'number'
    | 'decimal'
    | 'date'
    | 'array'
    | 'object'
    | 'boolean';

    type SqlType =
    | SqlTypeName
    | {
          type: 'decimal';
          /** 总位数,默认 10 */
          precision?: number;
          /** 小数位数,默认 2 */
          scale?: number;
      };

未配置 sqlType 时,默认按 stringVARCHAR(255))处理。

注意事项

  • 导出 SQL 主要用于辅助建表与结构变更,生成结果建议人工确认后再执行。
  • 字段是否必填会影响列的 NOT NULL / NULL
  • 对比变更时依赖字段注释中的组件标识;请尽量保留设计器生成的完整建表 SQL,再用于 getSQLDiff
  • 该能力与「数据库表设计」文档中的业务库表方案相互独立:前者按表单字段生成数据表,后者给出表单配置自身的存储建议。