import { Model2Object } from "./model2object"; /** * 模型转sql */ export class Model2Sql{ /** * 生成sql * @param modelPath - 模型路径 * @param dstPath - 目标路径 */ public genSql(modelPath:string,dstPath:string){ const me = this; const fsMdl = require('fs'); //关系集合 {依赖表.字段:被依赖表.字段} const relations = {}; //create table 串数组 const sqlArr:string[] = []; //drop table 串数组 const dropArr:string[] = []; //转换成model对象 const models = Model2Object.gen(modelPath); //遍历生成单个sql for(let key of Object.keys(models)){ dropArr.push(`drop table if exists ${key.toUpperCase()};`) sqlArr.push(this.genOneModelSql(models[key],relations)); } //处理关联关系 for(let key of Object.keys(relations)){ const ka = key.split('.'); const v = relations[key]; //删除父时操作,如果为文件,则set null,否则cascade const delOp = v.tbl === 'AM_FILE'?'set null':'cascade'; sqlArr.push(`alter table ${ka[0]} add constraint FK_${ka[0]}_${ka[1]} foreign key (${ka[1]}) references ${v.tbl} (${v.field}) on delete ${delOp} on update cascade;`); } //写文件 fsMdl.writeFileSync(dstPath,dropArr.concat(sqlArr).join('\r\n')); } /** * 生产一个model的sql * @param modelPath */ private genOneModelSql(modelCfg,relations):string{ const fieldArr:string[] = []; const tblName = modelCfg.ref.toUpperCase(); let pKey; for(let cfg of modelCfg.props){ let str = '\t'; let fieldName = cfg.name.toUpperCase(); let s; if(cfg.isId){ s = 'bigint not null auto_increment' pKey = cfg.name; }else{ //普通字段,处理数据类型 switch(cfg.type){ case 'string': s = 'varchar('; let len = 128; if(cfg.validator){ for(let v of cfg.validator){ //有最长度 if(v.includes('maxLength:')){ len = v.substring(v.indexOf('maxLength:') + 10); } } } s += len + ')'; break; case 'int': s = 'bigint'; break; case 'bool': s = 'tinyint'; break; case 'ref': s = 'bigint'; if(cfg.ref === 'MdlAmFile'){ //文件 relations[tblName + '.' + fieldName] = { tbl:'AM_FILE', field:'FILE_ID' } }else if(cfg.ref === 'MdlAmDataImport'){ //导入批次 relations[tblName + '.' + fieldName] = { tbl:'AM_DATA_IMPORT', field:'DATA_IMPORT_ID' } }else{ //其它 relations[tblName + '.' + fieldName] = { tbl:cfg.ref.substring(3).toUpperCase(), field:cfg.editOption.option.valueProp.toUpperCase() } } break; default: s = cfg.type; } } str += fieldName + '\t' + s + ','; fieldArr.push(str); } //处理主键 if(pKey){ fieldArr.push(`\tprimary key (${pKey})`); } return `create table ${tblName}(\r\n${fieldArr.join('\r\n')}\r\n);` } }