zoukankan      html  css  js  c++  java
  • 【工具】代码生成器-python脚本

    我觉得造轮子这件事情,是谁都可以做的。只不过做得好或者不好而已,用心了做得就要优雅一点。

    之前用过java的代码生成器,什么pojodobodbo都能生成,于是我也来自己造一个轮子。

    造轮子的事情是没必要做得,费神费心,还没人家做得好,那么我还是要做,就当是体验一把了,看看细节是怎么实现的。

    前期准备:

    1. 一台装有python、mysql的机器和若干待生成的表。
    2. python版本:3.6.4
    3. python安装mysql模块:pip install pymysql。(python2安装:pip install mysql-python
    4. 目标语言:java

    待生成为了实现各种数据类型,我们定义一个包含多种数据类型的实体表t_model,数据结构如下。

    drop table if exists t_model;
    create table t_model(
    	f_id varchar(64) primary key not null, --varchar 主键
    	f_number int null,
    	f_datetime datetime,
    	f_double double
    )
    
    

      

    目标格式:

    package com.dyi.po;
    
    import java.util.Date;
    /**
     * 表t_model模型
     * @author WYB
     *
     */
    public class Model {
    	private String id;
    	private int number;
    	private Date date;
    	private double dble;
    	
    	
    	
    	public Model() {
    		super();
    	}
    	public Model(String id, int number, Date date, double dble) {
    		super();
    		this.id = id;
    		this.number = number;
    		this.date = date;
    		this.dble = dble;
    	}
    	/**
    	 * 
    	 * @return
    	 */
    	public String getId() {
    		return id;
    	}
    	public void setId(String id) {
    		this.id = id;
    	}
    	/**
    	 * 
    	 * @return
    	 */
    	public int getNumber() {
    		return number;
    	}
    	public void setNumber(int number) {
    		this.number = number;
    	}
    	/**
    	 * 
    	 * @return
    	 */
    	public Date getDate() {
    		return date;
    	}
    	public void setDate(Date date) {
    		this.date = date;
    	}
    	/**
    	 * 
    	 * @return
    	 */
    	public double getDble() {
    		return dble;
    	}
    	public void setDble(double dble) {
    		this.dble = dble;
    	}
    	
    }
    

      

    开始编写脚本

    第一步:查询表结构

        sql = """
          select 
          column_name,data_type,character_maximum_length,column_key,column_comment
          from information_schema.`COLUMNS` 
          where  TABLE_NAME = "%s"
          """%tableName
        cursor.execute(sql)
        tableColumnList = cursor.fetchall()
    

      

    第二步:分析列的类型

    cursor.execute(sql)
        tableColumnList = cursor.fetchall()
    
        modelName = tableName
        modelName = modelName[modelName.find("_") + 1:]
        modelName = modelName[0].upper()+modelName[1:]
        fieldInfoList = []
        for col in tableColumnList:
            colName = col[0]
            colType = col[1].lower()
            colLen = col[2]
            priKey = col[3]
            comment = col[4]
    

      

    第三步:拆分字段名,处理细节,生成代码

    import pymysql
    
    ##连接数据库
    db = pymysql.connect("localhost","root","root","stagebo")
    cursor = db.cursor()
    
    def log(str):
        print(str)
    
    def getTableList():
        log("开始查询所有数据表...")
        cursor.execute("show tables")
        tableList = cursor.fetchall()
        tList = []
        for t in tableList:
            tList.append(t[0])
        return tList
    
    
    
    def getTableInfo(tableName):
        log("开始获取表结构")
        sql = """
        select 
         column_name,data_type,character_maximum_length,column_key,column_comment
        from information_schema.`COLUMNS` 
        where  TABLE_NAME = "%s"
        """%tableName
        cursor.execute(sql)
        tableColumnList = cursor.fetchall()
    
        modelName = tableName
        modelName = modelName[modelName.find("_") + 1:]
        modelName = modelName[0].upper()+modelName[1:]
        fieldInfoList = []
        for col in tableColumnList:
            colName = col[0]
            colType = col[1].lower()
            colLen = col[2]
            priKey = col[3]
            comment = col[4]
            #字段去掉“f_”
            colName = colName[colName.find("_")+1:]
            #colName = colName[0].upper()+colName[1:]
            #判断类型
            type = ""
            if colType in ["varchar","nvarchar"]:
                type = "String"
            elif colType == "int":
                type = "int"
            elif colType in ["double","float"]:
                type = "double"
    
            pk = False
            if priKey == "PRI":
                pk = True
            fieldInfoList.append([colName,type,pk])
    
        file = open("%s.java"%modelName, "w")
        code = """
        package com.dyi.po;
    
        import java.util.*;
    
        /**
         * 表%s模型
         *
         */
    
        """ %tableName
    
        code += "public class %s {"%modelName
        for item in fieldInfoList:
            code += """  
              
            private %s %s; """%(item[1],item[0])
    
        code +="""
        
            /*
             * 空构造函数
             */
            public %s(){
               super();
            }
                
        """%modelName
    
        code += """    
            /**
             *全参数构造函数
             */
            public %s("""%modelName
        for item in fieldInfoList:
            code += "%s %s, "%(item[1],item[0])
        code = code[:-1]
        code += """) {
                super();"""
        for item in fieldInfoList:
            code += """
                this.%s = %s;"""%(item[0],item[0])
    
        code += """
            }"""
    
        for item in fieldInfoList:
            t = item[1]
            n = item[0]
            nu = n[0].upper()+n[1:]
            code += """
            
                /**
                 *
                 * @return
                 */
                public %s get%s(){
                    return this.%s;
                }
                public void set%s(%s %s){
                    this.%s = %s;
                }
            """%(t,nu,n,nu,t,n,n,n)
        code += "}"
        file.write(code)
        file.flush()
        file.close()
    
    if __name__ == "__main__":
        #查询表
        tableList = getTableList()
    
        #定义要导出的表
        tableToScript = ["t_model"]
    
        #开始遍历
        for tableName in tableToScript:
            if tableName not in tableList:
                continue
            print(tableName)
            getTableInfo(tableName)
    

      结果展示

        package com.dyi.po;
    
        import java.util.*;
    
        /**
         * 表t_model模型
         *
         */
    
        public class Model {  
              
            private String id;   
              
            private int number;   
              
            private  date;   
              
            private double dble; 
        
            /*
             * 空构造函数
             */
            public Model(){
               super();
            }
                
            
            /**
             *全参数构造函数
             */
            public Model(String id, int number,  date, double dble,) {
                super();
                this.id = id;
                this.number = number;
                this.date = date;
                this.dble = dble;
            }
            
                /**
                 *
                 * @return
                 */
                public String getId(){
                    return this.id;
                }
                public void setId(String id){
                    this.id = id;
                }
            
            
                /**
                 *
                 * @return
                 */
                public int getNumber(){
                    return this.number;
                }
                public void setNumber(int number){
                    this.number = number;
                }
            
            
                /**
                 *
                 * @return
                 */
                public  getDate(){
                    return this.date;
                }
                public void setDate( date){
                    this.date = date;
                }
            
            
                /**
                 *
                 * @return
                 */
                public double getDble(){
                    return this.dble;
                }
                public void setDble(double dble){
                    this.dble = dble;
                }
            }
    

      然后流程就通了,一通百通,别的就可以照旧了~~~

  • 相关阅读:
    第4次作业(条件)比较大小。第3次作业(条件)计算火车运行时间。
    GitHub搜索技巧
    flex实现左中固定不变,右边自适应
    JavaScript高级__原型继承+组合继承
    JavaScript高级__深入了解闭包
    JavaScript高级__执行上下文代码案例
    JavaScript中的显式原型链 prototype 和隐式原型 __proto__
    谷歌强大插件收集,持续更新。。。
    js中~~和^=
    vue自定义指令----directive
  • 原文地址:https://www.cnblogs.com/wyongbo/p/8134360.html
Copyright © 2011-2022 走看看