赞
踩
最近需求有点多啊,做一个小需求就有一堆表结构,一个一个实行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
修改一下就可以了,只要文件名,不要后缀。
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!!!下面为运行结果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。