表格形式的数据库表的元数据与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建表主要部分使用,实现逻辑简单,但难免有所不足,欢迎参与建议与完善。

相关推荐
\xin2 小时前
Pikachu的python一键exp,xx型注入,“insert/updata“注入,“delete“注入,“http header“注入
数据库·python·http
of Watermelon League2 小时前
Redis 下载与安装 教程 windows版
数据库·windows·redis
coNh OOSI2 小时前
如何在 Windows 上安装 MySQL(保姆级教程2024版)
数据库·windows·mysql
Chasing__Dreams2 小时前
Redis--基础知识点--31--集群哈希槽为什么是16384?
数据库·redis·哈希算法
SeSs IZED2 小时前
MySQL中查看表结构
数据库·mysql·oracle
北冥有羽Victoria2 小时前
Django Auth组件完整版教程:从原理到项目落地
大数据·服务器·数据库·后端·python·django·sqlite
Irene19912 小时前
Oracle 21c XE 大数据开发常用 SQL 语法总结(不同 Oracle 版本,sql 语法大部分通用)
大数据·sql·oracle
ZGi.ai2 小时前
自然语言查数据库:Text-to-SQL工程实现与企业落地细节
数据库·sql·nl2sql·text-to-sql
Irene19912 小时前
SQL 中单引号与双引号的使用要求(严格区分)
sql