开头
在数据迁移过程中,涉及到数据库重建或者库表元数据生成表格存为资料。少量的库表和表格制作不会有什么影响,但是大量的库表重建或整理会影响效率同样也是枯燥的工作。在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建表主要部分使用,实现逻辑简单,但难免有所不足,欢迎参与建议与完善。