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

简介: 我觉得造轮子这件事情,是谁都可以做的。只不过做得好或者不好而已,用心了做得就要优雅一点。 之前用过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;
            }
        }

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

黑夜给了我黑色的眼睛,我却用它寻找光明
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
2月前
|
XML 数据格式 Python
从手动编辑到代码生成:Python 助你高效创建 Word 文档
本文介绍如何用Python实现Word文档自动化生成,结合python-docx、openpyxl和matplotlib库,高效完成报告撰写、数据插入与图表生成,大幅提升办公效率,降低格式错误,实现数据驱动的文档管理。
517 2
|
3月前
|
存储 缓存 测试技术
理解Python装饰器:简化代码的强大工具
理解Python装饰器:简化代码的强大工具
|
4月前
|
JSON 算法 API
深度分析小红书城API接口,用Python脚本实现
小红书作为以UGC内容为核心的生活方式平台,其非官方API主要通过移动端抓包解析获得,涵盖内容推荐、搜索、笔记详情、用户信息和互动操作等功能。本文分析了其接口体系、认证机制及请求规范,并提供基于Python的调用框架,涉及签名生成、登录态管理与数据解析。需注意非官方接口存在稳定性与合规风险,使用时应遵守平台协议及法律法规。
|
4月前
|
JSON API 数据安全/隐私保护
【干货满满】分享微店API接口到手价,用python脚本实现
微店作为知名社交电商平台,其开放平台提供商品查询、订单管理等API接口。本文介绍如何通过微店API获取商品到手价(含优惠、券等),涵盖认证机制、Python实现及关键说明。
|
4月前
|
JSON API 数据格式
深度分析大麦网API接口,用Python脚本实现
大麦网为国内领先演出票务平台,提供演唱会、话剧、体育赛事等票务服务。本文基于抓包分析其非官方接口,并提供Python调用方案,涵盖演出列表查询、详情获取及城市列表获取。需注意非官方接口存在稳定性风险,使用时应遵守平台规则,控制请求频率,防范封禁与法律风险。适用于个人学习、演出信息监控等场景。
|
4月前
|
程序员 测试技术 开发者
Python装饰器:简化代码的强大工具
Python装饰器:简化代码的强大工具
233 92
|
3月前
|
机器学习/深度学习 编解码 Python
Python图片上采样工具 - RealESRGANer
Real-ESRGAN基于深度学习实现图像超分辨率放大,有效改善传统PIL缩放的模糊问题。支持多种模型版本,推荐使用魔搭社区提供的预训练模型,适用于将小图高质量放大至大图,放大倍率越低效果越佳。
297 3
|
4月前
|
人工智能 自然语言处理 安全
Python构建MCP服务器:从工具封装到AI集成的全流程实践
MCP协议为AI提供标准化工具调用接口,助力模型高效操作现实世界。
894 1
|
4月前
|
JSON API 开发者
深度分析阿里妈妈API接口,用Python脚本实现
阿里妈妈是阿里巴巴旗下营销平台,提供淘宝联盟、直通车等服务,支持推广位管理、商品查询等API功能。本文详解其API调用方法,重点实现商品推广信息(佣金、优惠券)获取,并提供Python实现方案。
|
4月前
|
JSON API 数据安全/隐私保护
深度分析虾皮城API接口,用Python脚本实现
虾皮开放平台提供丰富的API接口,支持商品管理、订单处理及促销信息查询等功能。本文详解API认证机制与调用方法,基于Python实现商品价格及到手价获取方案,适用于电商数据分析与运营。

推荐镜像

更多