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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 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
目录
相关文章
|
17天前
|
数据采集 监控 数据挖掘
Python自动化脚本:高效办公新助手###
本文将带你走进Python自动化脚本的奇妙世界,探索其在提升办公效率中的强大潜力。随着信息技术的飞速发展,重复性工作逐渐被自动化工具取代。Python作为一门简洁而强大的编程语言,凭借其丰富的库支持和易学易用的特点,成为编写自动化脚本的首选。无论是数据处理、文件管理还是网页爬虫,Python都能游刃有余地完成任务,极大地减轻了人工操作的负担。接下来,让我们一起领略Python自动化脚本的魅力,开启高效办公的新篇章。 ###
|
14天前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录
|
20天前
|
JavaScript 前端开发 开发者
探索 DrissionPage: 强大的Python网页自动化工具
DrissionPage 是一个基于 Python 的网页自动化工具,结合了浏览器自动化的便利性和 requests 库的高效率。它提供三种页面对象:ChromiumPage、WebPage 和 SessionPage,分别适用于不同的使用场景,帮助开发者高效完成网页自动化任务。
89 4
|
25天前
|
存储 Python
Python自动化脚本编写指南
【10月更文挑战第38天】本文旨在为初学者提供一条清晰的路径,通过Python实现日常任务的自动化。我们将从基础语法讲起,逐步引导读者理解如何将代码块组合成有效脚本,并探讨常见错误及调试技巧。文章不仅涉及理论知识,还包括实际案例分析,帮助读者快速入门并提升编程能力。
57 2
|
27天前
|
运维 监控 Python
自动化运维:使用Python脚本简化日常任务
【10月更文挑战第36天】在数字化时代,运维工作的效率和准确性成为企业竞争力的关键。本文将介绍如何通过编写Python脚本来自动化日常的运维任务,不仅提高工作效率,还能降低人为错误的风险。从基础的文件操作到进阶的网络管理,我们将一步步展示Python在自动化运维中的应用,并分享实用的代码示例,帮助读者快速掌握自动化运维的核心技能。
59 3
|
1月前
|
缓存 运维 NoSQL
python常见运维脚本_Python运维常用脚本
python常见运维脚本_Python运维常用脚本
30 3
|
1月前
|
数据采集 JSON 数据安全/隐私保护
Python常用脚本集锦
Python常用脚本集锦
26 2
|
1月前
|
运维 监控 应用服务中间件
自动化运维:如何利用Python脚本提升工作效率
【10月更文挑战第30天】在快节奏的IT行业中,自动化运维已成为提升工作效率和减少人为错误的关键技术。本文将介绍如何使用Python编写简单的自动化脚本,以实现日常运维任务的自动化。通过实际案例,我们将展示如何用Python脚本简化服务器管理、批量配置更新以及监控系统性能等任务。文章不仅提供代码示例,还将深入探讨自动化运维背后的理念,帮助读者理解并应用这一技术来优化他们的工作流程。
|
1月前
|
运维 监控 Linux
自动化运维:如何利用Python脚本优化日常任务##
【10月更文挑战第29天】在现代IT运维中,自动化已成为提升效率、减少人为错误的关键技术。本文将介绍如何通过Python脚本来简化和自动化日常的运维任务,从而让运维人员能够专注于更高层次的工作。从备份管理到系统监控,再到日志分析,我们将一步步展示如何编写实用的Python脚本来处理这些任务。 ##
|
1月前
|
JSON 测试技术 持续交付
自动化测试与脚本编写:Python实践指南
自动化测试与脚本编写:Python实践指南
32 1