js解析建表SQL

 如下一个建表sql

 CREATE TABLE `blog_info` (
    `blogId` int(11) NOT NULL AUTO_INCREMENT COMMENT '文章编号',
    `updateTime` varchar(100) DEFAULT NULL COMMENT '更新时间',
    `inputUserId` varchar(100) DEFAULT NULL COMMENT '录入人',
    PRIMARY KEY (`blogId`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='博客内容表'

解析代码如下:(只是针对上方的格式,DBeaver软件生成的DDL)

/**
 * 解析建表sql信息成一个对象
 * @param sql 格式:

 CREATE TABLE `blog_info` (
    `blogId` int(11) NOT NULL AUTO_INCREMENT COMMENT '文章编号',
    `updateTime` varchar(100) DEFAULT NULL COMMENT '更新时间',
    `inputUserId` varchar(100) DEFAULT NULL COMMENT '录入人',
    PRIMARY KEY (`blogId`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='博客内容表'

 * @returns {{field_array: [], table_name: string, table_annotation: string}}
 */
function analysis_create_sql(sql) {
    sql=sql.trim();
    let sql_big=sql.toUpperCase();//大写sql,用来定位,取值还是取原sql
    let table_name=sql.substring(sql_big.indexOf("TABLE")+5,sql_big.indexOf("(")).trim();//表名
    if(table_name.startsWith("`")){
        table_name=table_name.substring(1,table_name.length-1);
    }
    let table_annotation=analysis_sql_annotation(sql.substring(sql_big.lastIndexOf("COMMENT")));//表注释
    let field_sql=cut_start_end_out(sql,"(",")").split(",");
    let field_array=[];//表字段
    let primaryKey="";
    field_sql.forEach(e=> {
        e = e.trim().toUpperCase();
        if (e.startsWith("PRIMARY")&&e.indexOf("KEY")>=0){
            primaryKey=e;
        }
    });
    field_sql.forEach(e=>{
        e=e.trim();
        if(e.toUpperCase().startsWith("PRIMARY KEY"))return;
        let obj={};//字段对象
        //字段名
        if(e.startsWith("`")){
            e=e.substring(1);
            obj.name=e.substring(0,e.indexOf("`"));
        }else{
            obj.name=e.substring(0,e.indexOf(" "));
        }
        e=e.substring(e.indexOf(obj.name)+obj.name.length+1).trim();
        //字段注释
        let e_big=e.toUpperCase();
        let p=e_big.indexOf("COMMENT");
        if(p>-1){
            obj.annotation=analysis_sql_annotation(e.substring(p));
            e=e.substring(0,p).trim();
        }else{
            obj.annotation=obj.name;
        }
        //字段类型
        p=e.indexOf(")")
        if(p>-1){
            obj.type=e.substring(0,p+1);
        }else if(e.indexOf(" ")<0){
            obj.type=e;
        }else{
            obj.type=e.substring(0,e.indexOf(" "));
        }
        //主键
        obj.primaryKey=primaryKey.indexOf(obj.name.toUpperCase())>=0;
        field_array[field_array.length]=obj;
    });

    return {
        table_name,
        table_annotation,
        field_array
    }
}

/**
 * 从一段SQL语句中解析出注释,sql格式如下:
 * @param sql  格式   COMMENT='注释'
 * @returns {string}
 */
function analysis_sql_annotation(sql){
    return sql.substring(sql.indexOf("'")+1,sql.lastIndexOf("'"));
}

/**
 * 截取字符串中间的内容
 * @param code   需要截取的内容
 * @param start   开始截取点(不包含)
 * @param end    结束截取点(不包含)
 * @returns {string}
 */
function cut_start_end_out(code,start,end){
    let start_p=0;
    let end_p=code.length;
    if(start!=null){
        start_p=code.indexOf(start);
        if(start_p<0){
            start_p=0;
        }
        start_p=start_p+start.length;
    }
    if(end!=null){
        end_p=code.lastIndexOf(end);
        if(end_p<0){
            end_p=code.length;
        }
    }
    return code.substring(start_p,end_p);
}

解析结果如下:

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值