• 如何快速的将Excel定义的表结构变成MySQL的建表语句


    如何快速的将Excel定义的表结构变成MySQL的建表语句

    最近需求有点多啊,做一个小需求就有一堆表结构,一个一个实行CV大法,实在太伤身体了,有没有能够快速便捷的方法将一大堆Excel表转换成MySQL的表结构建表语句呢,网上张罗找了半天发现毛也没有,找到了也没有用,也就是换个地方CV而已,手敲键盘的数量依旧没有减少,怎么办?只能自己手敲一个工具了,将20张Excel定义的表转换成SQL建表语句了。

    此处我的技术选型为python,别问为什么,问就是我只会python,其它的我啥也不会。

    下面使在Excel中定义好的表结构,其中第一行最后一列tb_user为当前表结构的名称。

    序号字段名称字段类型描述是否为空索引类型tb_user
    1idint主键NOPRI
    2usernamevarchar(20)用户名NO
    3passwordvarchar(20)密码NO
    4ageint年龄NO
    5genderint性别:0-女 1-男NO
    6birthdaydate生日NO
    7create_timedatetime创建时间NO
    8creatorvarchar(20)创建人NO
    9update_timedatetime修改时间NO
    10updatervarchar(20)修改人NO
    11remarkdatetime备注NO

    为了方便编程,我将这些表结构从Excel中复制到了CSV文件,新建一个user.csv文件,放到当前pycharm工程目录下,其中内容如下,在CV的时候,需要每个数据中间的空格替换成,。别问为什么,问就是方便我写的程序好识别。

    序号,字段名称,字段类型,描述,是否为空,索引类型,tb_user
    1,id,int,主键,NO,PRI
    2,username,varchar(20),用户名,NO
    3,password,varchar(20),密码,NO
    4,age,int,年龄,NO
    5,gender,int,性别:0-女 1-男,NO
    6,birthday,date,生日,NO
    7,create_time,datetime,创建时间 ,NO
    8,creator,varchar(20),创建人,NO
    9,update_time,datetime,修改时间,NO
    10,updater,varchar(20),修改人,NO
    11,remark,datetime,备注,NO
    

    接下来就是将这个文件在程序中修改一下,将这个self.source_table_name=user修改一下就可以了,只要文件名,不要后缀。

    import csv
    from datetime import datetime
    
    
    class CreateTable:
    
        def __init__(self):
            self.source_table_name = "user"
            self.csv_post_fix = '.csv'
            self.sql_post_fix = '.sql'
            self.table_name_prefix = 'create_'
    
        def read_csv_standard(self, file_path):
            data = []
            with open(file_path, encoding="utf-8", mode='r') as file:
                reader = csv.reader(file)
                for row in reader:
                    data.append(row)
            return data
    
        def handle(self, rows):
            tables = []
            last_index = 0
            for index, row in enumerate(rows):
                if len(row) == 0:
                    table = rows[last_index:index]
                    tables.append(table)
                    last_index = index + 1
                    # print(table)
                elif index == (len(rows) - 1):
                    table = rows[last_index:index]
                    tables.append(table)
                    last_index = index + 1
                    # print(table)
            return tables
    
        def create_table_sql(self, table_rows):
            table_sql = ""
            id_col_sql = "`{}` {} NOT NULL AUTO_INCREMENT COMMENT '{}'"
            str_col_sql = "`{}` {} DEFAULT NULL COMMENT '{}'"
            time_col_sql = "`{}` {}  DEFAULT current_timestamp() COMMENT '{}'"
            update_time_col_sql = "`{}` {}  DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '{}'"
            last_sql = '\tPRIMARY KEY (`id`) \n) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;'
            for index, table_row in enumerate(table_rows):
                current_sql = ""
                # print(table_row)
                if index == 0:
                    current_sql += "DROP TABLE IF EXISTS {};\n".format(table_row[-1])
                    current_sql += "CREATE TABLE `{}` (".format(table_row[-1])
                    table_sql += current_sql + "\n"
                    continue
                if table_row[1] == 'id':
                    current_sql = id_col_sql.format(table_row[1], table_row[2], table_row[3])
                elif 'update_time' in table_row[1]:
                    current_sql = update_time_col_sql.format(table_row[1], table_row[2], table_row[3])
                elif 'time' in table_row[1]:
                    current_sql = time_col_sql.format(table_row[1], table_row[2], table_row[3])
                else:
                    current_sql = str_col_sql.format(table_row[1], table_row[2], table_row[3])
                table_sql += "\t" + current_sql + ",\n"
            table_sql += last_sql + "\n\n"
            return table_sql
    
        def do_work(self):
            date = str(datetime.now().strftime('%Y-%m-%d'))
            with open(self.table_name_prefix + self.source_table_name + "_" + date + self.csv_post_fix, "w",
                      encoding="utf-8") as f:
                rows = self.read_csv_standard(self.source_table_name + self.csv_post_fix)
                tables = self.handle(rows)
                for table in tables:
                    table_sql = self.create_table_sql(table)
                    print(table_sql)
                    f.write(table_sql)
    
    
    if __name__ == '__main__':
        createTable = CreateTable()
        createTable.do_work()
    
    

    整完了上面的步骤之后,就可以直接运行输出建表语句了,此时工程目录会多一个create_user_2024-05-30.csv文件,下面为建表语句。

    DROP TABLE IF EXISTS tb_user;
    CREATE TABLE `tb_user` (
    	`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
    	`username` varchar(20) DEFAULT NULL COMMENT '用户名',
    	`password` varchar(20) DEFAULT NULL COMMENT '密码',
    	`age` int DEFAULT NULL COMMENT '年龄',
    	`gender` int DEFAULT NULL COMMENT '性别:0-女 1-男',
    	`birthday` date DEFAULT NULL COMMENT '生日',
    	`create_time` datetime  DEFAULT current_timestamp() COMMENT '创建时间 ',
    	`creator` varchar(20) DEFAULT NULL COMMENT '创建人',
    	`update_time` datetime  DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '修改时间',
    	`updater` varchar(20) DEFAULT NULL COMMENT '修改人',
    	PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
    

    将这个文件拖入到navicat中一键运行,不出问题的话麦克阿瑟表示非常nice!!!下面为运行结果

    image-20240530133031039

  • 相关阅读:
    软考系列(系统架构师)- 2014年系统架构师软考案例分析考点
    Linux生产者和消费者模型 条件变量 信号量
    单目相机模型
    图文并茂 —— 插入排序,希尔排序
    CMake篇1: Windows上用CMake编译生成可执行程序
    [附源码]计算机毕业设计springboot家庭整理服务管理系统
    这应该是Linux用户与用户组最详细的知识了吧!
    数据库约束
    模板-初阶
    Qt自带的日志重定向机制
  • 原文地址:https://blog.csdn.net/weixin_46294086/article/details/139321794