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

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

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

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

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

序号 字段名称 字段类型 描述 是否为空 索引类型 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

为了方便编程,我将这些表结构从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修改一下就可以了,只要文件名,不要后缀。

python 复制代码
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文件,下面为建表语句。

SQL 复制代码
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!!!下面为运行结果

相关推荐
Angel Q.4 分钟前
特征提取 | DINO 到 DINOv3
图像处理·python
瞬间&永恒~22 分钟前
【MySQL】4-6:在同一个主机上使用 systemd 运行多个 MySQL服务器
服务器·数据库·mysql
不如语冰33 分钟前
AI大模型入门-pytorch-张量2 tensor创建
python
NPE~1 小时前
[AI]Agent开发——ADK框架使用
人工智能·python·ai·教程·adk·agent开发
矮个史蒂芬1 小时前
统计verilog .v文件中output 的bit数
python
gwf2161 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
爱吃提升2 小时前
python 分布式爬虫、爬虫合规与综合实战项目
分布式·爬虫·python
审小匠OpenCPAi2 小时前
银行流水核查怎么自动化?单边匹配、双向勾稽与图聚类异常检测的工程对比
java·前端·人工智能·python·审计
元Y亨H3 小时前
Pandas 解析 Excel 导致的内存溢出(MemoryError)
python·excel
一嘴一个橘子3 小时前
MysqL 哪些情况适合创建索引
mysql