表格形式的数据库表的元数据与SQL字符串互转

开头

  在数据迁移过程中,涉及到数据库重建或者库表元数据生成表格存为资料。少量的库表和表格制作不会有什么影响,但是大量的库表重建或整理会影响效率同样也是枯燥的工作。在AI发达的当今,用AI也是不错的选择,但是AI存在一定的安全风险。首先,将库表结构上传到AI平台存在数据泄露风险。其次,AI的转换通常需要辅助人工审核,出错还需纠正。最后,AI平台的可能存在上下文认知不足的风险。因此,离线的程序转换还是不错的选择。

处理方案

  编程一个python的Converter类,见git@gitee.com:learntopain/table-sqlconverter.git 或者git@github.com:huangjie155/TableSQLConverter.git中的,可实现

  tbl字符串到json的转换

  json到mysql建表语句的转换

  mysql的json转换到hive数据类型的json

  mysql字符转到json最终到table或hivesql的转换

  如果有datax同步,配置mysql与hive字段部分也可以通过json转换。

示例table转mysql

python 复制代码
tbl="""表名   字段名    字段注释   字段类型   长度 约束 默认值
sys_user   user_id    用户主键 ID    bigint -  PK、自增  -
sys_user   username   登录账号(学号 / 工号)  varchar    50 UK、NOT NULL    -
sys_user   password   登录密码(加密存储) varchar    100    NOT NULL   -
sys_user   user_type  用户类型 1 = 管理员 2 = 教师 3 = 学生 tinyint    -  NOT NULL   3
sys_user   real_name  真实姓名   varchar    30 NOT NULL   -
sys_user   phone  联系电话   varchar    20 -  NULL
sys_user   email  邮箱 varchar    50 -  NULL
sys_user   status 状态 0 = 禁用 1 = 正常   tinyint    -  NOT NULL   1
sys_user   create_time    创建时间   datetime   -  NOT NULL   CURRENT_TIMESTAMP
sys_user   update_time    更新时间   datetime   -  NOT NULL   CURRENT_TIMESTAMP ON UPDATE
student    student_id 学生主键 ID    bigint -  PK、自增  -
student    user_id    关联系统用户 ID  bigint -  FK、NOT NULL    -
student    student_no 学号 varchar    30 UK、NOT NULL    -
student    dept_id    所属院系 ID    bigint -  FK、NOT NULL    -
student    class_id   所属班级 ID    bigint -  FK NULL
student    gender 性别 0 = 女 1 = 男 tinyint    -  -  NULL
student    id_card    身份证号   varchar    18 -  NULL
student    address    家庭住址   varchar    200    -  NULL
student    enrollment_date    入学日期   date   -  -  NULL
student    status 状态 1 = 在读 2 = 毕业 3 = 休学    tinyint    -  NOT NULL   1
"""

from TblSqlConverter import Converter
myCvt=Converter()
mysqlschema=myCvt.tblstr2schema(tbl,0,1,3,2,dataNo=1) #第0列是表名,DataNo=1是从第1行开始是主要数据
print(mysqlschema)
#中间数据形式结果是:
"""
{'sys_user': [{'field': 'user_id', 'type': 'bigint', 'comment': '用户主键 ID'}, {'field': 'username', 'type': 'varchar', 'comment': '登录账号(学号 / 工号)'}, {'field': 'password', 'type': 'varchar', 'comment': '登录密码(加密存储)'}, {'field': 'user_type', 'type': 'tinyint', 'comment': '用户类型 1 = 管理员 2 = 教师 3 = 学生'}, {'field': 'real_name', 'type': 'varchar', 'comment': '真实姓名'}, {'field': 'phone', 'type': 'varchar', 'comment': '联系电话'}, {'field': 'email', 'type': 'varchar', 'comment': '邮箱'}, {'field': 'status', 'type': 'tinyint', 'comment': '状态 0 = 禁用 1 = 正常'}, {'field': 'create_time', 'type': 'datetime', 'comment': '创建时间'}, {'field': 'update_time', 'type': 'datetime', 'comment': '更新时间'}], 'student': [{'field': 'student_id', 'type': 'bigint', 'comment': '学生主键 ID'}, {'field': 'user_id', 'type': 'bigint', 'comment': '关联系统用户 ID'}, {'field': 'student_no', 'type': 'varchar', 'comment': '学号'}, {'field': 'dept_id', 'type': 'bigint', 'comment': '所属院系 ID'}, {'field': 'class_id', 'type': 'bigint', 'comment': '所属班级 ID'}, {'field': 'gender', 'type': 'tinyint', 'comment': '性别 0 = 女 1 = 男'}, {'field': 'id_card', 'type': 'varchar', 'comment': '身份证号'}, {'field': 'address', 'type': 'varchar', 'comment': '家庭住址'}, {'field': 'enrollment_date', 'type': 'date', 'comment': '入学日期'}, {'field': 'status', 'type': 'tinyint', 'comment': '状态 1 = 在读 2 = 毕业 3 = 休学'}]}
"""
mysqlstr=myCvt.schema2mysql(mysqlschema)
print(mysqlstr)
#输出结果:
"""
CREATE TABLE IF NOT EXISTS sys_user(`user_id` bigint comment '用户主键 ID',`username` varchar comment '登录账号(学号 / 工号)',`password` varchar comment '登录密码(加密存储)',`user_type` tinyint comment '用户类型 1 = 管理员 2 = 教师 3 = 学生',`real_name` varchar comment '真实姓名',`phone` varchar comment '联系电话',`email` varchar comment '邮箱',`status` tinyint comment '状态 0 = 禁用 1 = 正常',`create_time` datetime comment '创建时间',`update_time` datetime comment '更新时间')
CREATE TABLE IF NOT EXISTS student(`student_id` bigint comment '学生主键 ID',`user_id` bigint comment '关联系统用户 ID',`student_no` varchar comment '学号',`dept_id` bigint comment '所属院系 ID',`class_id` bigint comment '所属班级 ID',`gender` tinyint comment '性别 0 = 女 1 = 男',`id_card` varchar comment '身份证号',`address` varchar comment '家庭住址',`enrollment_date` date comment '入学日期',`status` tinyint comment '状态 1 = 在读 2 = 毕业 3 = 休学')
"""

注意,此方法可以应对sql建表主要部分使用,实现逻辑简单,但难免有所不足,欢迎参与建议与完善。

相关推荐
仙俊红17 小时前
事务消息是什么
jvm·数据库·oracle
闪电悠米17 小时前
黑马点评-分布式锁-03_lua_atomic_unlock
java·数据库·分布式·缓存·oracle·wpf·lua
码不停蹄的玄黓17 小时前
MySQL唯一索引能否做主键索引
数据库·sql·mysql
段一凡-华北理工大学17 小时前
工业领域的Hadoop架构学习~系列文章09:HBase列式数据库
数据库·人工智能·hadoop·架构·hbase·高炉炼铁·高炉炼铁智能化
江畔柳前堤18 小时前
XZ09_Word和MD格式转换
开发语言·数据库·人工智能·python·深度学习·word
移动云开发者联盟18 小时前
信创版图加速扩展!移动云云数据库Redis通过安全可信认证
数据库·安全
小马爱打代码18 小时前
SpringBoot + 本地缓存 + 布隆过滤器:防止恶意 ID 查询打穿数据库
数据库·spring boot·缓存
憧憬成为java架构高手的小白18 小时前
数据库期末复习笔记
数据库·笔记·oracle
10WTW0118 小时前
个人思考记录(一)What u need in AI era
数据库·mongodb
六月雨滴18 小时前
Oracle 性能监控体系概述
数据库·oracle·dba