如何快速的将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

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JavaGPT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值