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

news2024/10/2 17:24:24

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1793849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Gmail 两步验证+应用专用密码登录

1、为什么做这个? 如果需要使用Gmail作为应用程序的邮件发送者,必须进行相关配置,否则不能直接使用 2、怎么做? 谷歌邮箱(gmail.com):两步验证应用专用密码登录 - 来发信 - 您的外贸拓客好帮…

递归在多级数据结构中的简单应用

哈喽,我是小码,半年多没更新了,这段时间换了新工作,工作也很忙。后续会尽量多写点,坚持确实是一件很难,很酷的事情。最近在公司负责开发商品有关的开发,商品包含类型、款式等属性,而…

从零开始发布你的第一个npm插件包并在多项目中使用

引言 在开源的世界里,每个人都有机会成为贡献者,甚至是创新的引领者。您是否有过这样的想法:开发一个解决特定问题的小工具,让她成为其他开发者手中的利器?今天,我们就来一场实战训练,学习如何将…

多链路聚合设备在自然灾害应急能力提升工程基层防灾项目内的应用

在近几年信息技术的飞速发展,面对应急通信和指挥调度时需要移动化无线通信技术来做支撑,多链路聚合设备在中间的作用至关重要,实现从车到车、人到车、车到中心的多样化应用场景进行数据图像的无线传输和多节点组网方案需求,来满足…

Linux[高级管理]——使用源码包编译安装Apache网站

🏡作者主页:点击! 👨‍💻Linux高级管理专栏:点击! ⏰️创作时间:2024年5月31日14点20分 🀄️文章质量:96分 在Linux系统上编译和安装Apache HTTP Server是…

乡村振兴与脱贫攻坚相结合:巩固拓展脱贫攻坚成果,推动乡村全面振兴,建设更加美好的乡村生活

目录 一、引言 二、巩固拓展脱贫攻坚成果 1、精准施策,确保稳定脱贫 2、强化政策支持,巩固脱贫成果 3、激发内生动力,促进持续发展 三、推动乡村全面振兴 1、加快产业发展,增强乡村经济实力 2、推进乡村治理体系和治理能力…

2.6倍!WhaleTunnel 客户POC实景对弈DataX

作为阿里早期的开源产品,DataX是一款非常优秀的数据集成工具,普遍被用于多个数据源之间的批量同步,包括类似Apache DolphinScheduler的Task类型也对DataX进行了适配和增强,可以直接在DolphinScheduler里面利用通用的数据源调用Dat…

Java面试——专业技能

优质博文:IT-BLOG-CN 一、简单讲下 Java 的跨平台原理 由于各个操作系统(Windows,Linux等)支持的指令集不是完全一致的。就会让我们程序在不同的操作系统上要执行不同的程序代码。Java 开发了适用于不同操作系统及位数的 Java 虚拟…

Python对获取数据的举例说明

当使用Python来获取数据时,有许多不同的方法和库可以根据你的需求来选择。以下是一些常见的示例,说明如何使用Python来从各种来源获取数据。 1. 从网站或API获取JSON数据 你可以使用requests库从网站或API获取JSON格式的数据。例如,从某个API…

C++ | Leetcode C++题解之第128题最长连续序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestConsecutive(vector<int>& nums) {unordered_set<int> num_set;for (const int& num : nums) {num_set.insert(num);}int longestStreak 0;for (const int& num : num_set) {…

accelerate 笔记:对齐不同设备配置的性能

在TPU、多GPU和单GPU上使用accelerate运行相同的脚本和相同的batch_size&#xff0c;可能结果是不一样的那应该怎么做呢? 1 设置正确的种子 确保在所有分布式情况下使用 utils.set_seed() 完全设置种子&#xff0c;以使训练可复现 from accelerate.utils import set_seedse…

【C++进阶】深入STL之string:模拟实现走进C++字符串的世界

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C模板入门 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STL之string &#x1f4d2;1. string…

男士什么牌子的内裤穿着舒服?五款实力派男士内裤分享

你是否曾因为内裤不透气、材质不佳而倍感烦恼&#xff1f;男士内裤作为贴身衣物&#xff0c;其舒适度和质量至关重要。在如今市场上品牌众多、材质各异的背景下&#xff0c;如何挑选一款合适的男士内裤成为了一大难题。 以下是测评过的部分男士内裤&#xff1a; 近期&#xff…

ArUco与AprilTag 标签

一、简介 在许多计算机视觉应用程序中&#xff0c;姿势估计非常重要&#xff1a;机器人导航&#xff0c;增强现实等等。 该过程基于发现真实环境中的点与其2d图像投影之间的对应关系。 这通常是一个困难的步骤&#xff0c;因此通常使用合成或基准标记来简化操作。 最受流行的…

20240606在Toybrick的TB-RK3588开发板的Android12下确认HDMI的驱动

20240606在Toybrick的TB-RK3588开发板的Android12下确认HDMI的驱动 2024/6/6 9:48 【原文是在RK3328的Android7.1下写的。我将它升级成为RK3588的Android12了】 RK平台主要采用 FB 和 DRM 两种显示框架。与此相对应&#xff0c; HDMI 也有两套驱动。 FB&#xff1a; LINUX 3.10…

技巧:合并ZIP分卷压缩包

如果ZIP压缩文件文件体积过大&#xff0c;大家可能会选择“分卷压缩”来压缩ZIP文件&#xff0c;那么&#xff0c;如何合并zip分卷压缩包呢&#xff1f;今天我们分享两个ZIP分卷压缩包合并的方法给大家。 方法一&#xff1a; 我们可以将分卷压缩包&#xff0c;通过解压的方式…

【CentOS 7】挑战探索:在CentOS 7上实现Python 3.9的完美部署指南

【CentOS 7】挑战探索&#xff1a;在CentOS 7上实现Python 3.9的完美部署指南 大家好 我是寸铁&#x1f44a; 总结了一篇【CentOS 7】挑战探索&#xff1a;在CentOS 7上实现Python 3.9的完美部署指南详细步骤✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 此篇教程只适用于p…

linux网络 dns域名解析

目录 DNS 域名体系结构 如何实现域名解析 正向解析 反向解析 主从服务器解析 bond 网卡 DNS 是域名系统的简称 域名和ip地址之间的映射关系 互联网中 IP地址是通信的唯一标识 逻辑地址 访问网站 域名 IP地址不好记 域名朗朗上口 好记 域名解析的目的就是为了实现 访…

搭建高可用k8s

高可用只针对于api-server&#xff0c;需要用到nginx keepalived&#xff0c;nginx提供4层负载&#xff0c;keepalived提供vip(虚拟IP) 系统采用openEuler 22.03 LTS 1. 前期准备 因为机器内存只有16G&#xff0c;所有我采用3master 1node 1.1 修改主机配置&#xff08;所有节…

fpga入门 串口定时1秒发送1字节

一、 程序说明 FPGA通过串口定时发送数据&#xff0c;每秒发送1字节&#xff0c;数据不断自增 参考小梅哥教程 二、 uart_tx.v timescale 1ns / 1psmodule uart_tx(input wire sclk,input wire rst_n,output reg uart_tx);parameter …