【工具】代码生成器-python脚本

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 我觉得造轮子这件事情,是谁都可以做的。只不过做得好或者不好而已,用心了做得就要优雅一点。 之前用过java的代码生成器,什么pojodobodbo都能生成,于是我也来自己造一个轮子。 造轮子的事情是没必要做得,费神费心,还没人家做得好,那么我还是要做,就当是体验一把了,看看细节是怎么实现的。

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

之前用过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;
            }
        }

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

黑夜给了我黑色的眼睛,我却用它寻找光明
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
10天前
|
Python
用python转移小文件到指定目录并压缩,脚本封装
这篇文章介绍了如何使用Python脚本将大量小文件转移到指定目录,并在达到大约250MB时进行压缩。
25 2
|
1天前
|
安全 Python
Python脚本实现IP按段分类
【10月更文挑战第04天】
14 7
|
5天前
|
测试技术 Python
Python MagicMock: Mock 变量的强大工具
Python MagicMock: Mock 变量的强大工具
23 8
|
5天前
|
机器学习/深度学习 人工智能 运维
自动化运维的魔法:如何利用Python脚本提升工作效率
【9月更文挑战第29天】在数字时代的浪潮中,IT运维人员面临着前所未有的挑战和机遇。本文将通过深入浅出的方式,介绍自动化运维的基本概念、核心价值以及使用Python脚本实现自动化任务的方法。我们将从实际案例出发,探讨如何利用Python简化日常的系统管理任务,提高运维效率,并展望自动化运维的未来趋势。无论你是初学者还是有经验的运维专家,这篇文章都将为你开启一扇通往高效工作方式的大门。
10 2
|
10天前
|
Python
python第三方库-字符串编码工具 chardet 的使用(python3经典编程案例)
这篇文章介绍了如何使用Python的第三方库chardet来检测字符串的编码类型,包括ASCII、GBK、UTF-8和日文编码的检测示例。
41 6
|
9天前
|
Web App开发 存储 安全
Python编写脚本,打开浏览器输入网址,自动化登陆网站
Python编写脚本,打开浏览器输入网址,自动化登陆网站
15 4
|
11天前
|
运维 监控 Python
自动化运维:使用Python脚本简化日常任务
【9月更文挑战第23天】在本文中,我们将探索如何通过编写Python脚本来自动化常见的系统管理任务,从而提升效率并减少人为错误。文章将介绍基础的Python编程概念、实用的库函数,以及如何将这些知识应用于创建有用的自动化工具。无论你是新手还是有经验的系统管理员,这篇文章都将为你提供有价值的见解和技巧,帮助你在日常工作中实现自动化。
|
13天前
|
运维 监控 安全
自动化运维:使用Python脚本简化日常任务
【9月更文挑战第21天】在快速迭代的软件开发环境中,运维工作往往因为重复性高、易出错而被诟病。本文将介绍如何通过编写简单的Python脚本来自动化这些日常任务,从而提升效率和减少错误。我们将以实际案例为基础,展示如何从零开始构建一个自动化脚本,并解释其背后的原理。文章旨在启发读者思考如何利用编程技能来解决工作中的实际问题,进而探索技术与日常工作流程结合的可能性。
|
9天前
|
Python Windows
python之windows脚本启动bat
python之windows脚本启动bat
|
10天前
|
运维 监控 Python
自动化运维:使用Python脚本实现日常任务
【9月更文挑战第24天】在现代的软件开发周期中,运维工作扮演着至关重要的角色。本文将介绍如何利用Python编写简单的自动化脚本,来优化和简化日常的运维任务。从备份数据到系统监控,Python的易用性和强大的库支持使其成为自动化运维的首选工具。跟随这篇文章,你将学习如何使用Python编写自己的自动化脚本,提高运维效率,减少人为错误,并最终提升整个开发流程的质量。
下一篇
无影云桌面