脚本工具---自动解析mysql建表语句,生成sqlalchemy表对象声明
常规建表语句:
CREATE TABLE `test_table` (
`id` int(11) NOT NULL,
`name` char(64) NOT NULL,
`password` char(64) NOT NULL,
PRIMARY KEY (`name`,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='test';
解析脚本代码:
# coding:utf-8 import re
def table_design_transfer(table_design):
type_map = {"varchar":"String","datetime":"DateTime","bigint":"BigInteger","smallint":"SmallInteger","tinyint":"SmallInteger","text":"Text","int":"Integer","double":"Float","char":"String","set":"Enum"}
l = table_design.split("\n") # 表设计行拆分
length = len(l)
s = []
primary_key_l = []
for i in range(length): # 遍历表设计行
j = l[length-1-i].strip().split(" ") # 倒序遍历,并按空格切分
if len(j)>2: # 只关注行长度超过2的元素
column = j[0].replace("`","")
i_type = j[1]
if column == "PRIMARY":
primary_key_l = re.sub(r'`|\(|\)','',j[2]).split(",") # 拿到主键key
continue
elif column == "CREATE": # 获取表名
table_name = j[2].replace("`","")
s.append(" "+'__tablename__ = "%s"' % table_name)
s.append("class %s(Base):" % table_name)
continue
elif column in ("UNIQUE",")","KEY"): # 非表列名,跳过
continue
if i_type in type_map.keys(): # 类型存在映射表中
i_type = i_type.replace(i_type,type_map[i_type])+"()"
elif "(" in i_type and i_type.split("(")[0] in type_map.keys(): # 类型有长度声明,提取类型字段,找到映射表映射value,并替换
old_type = i_type.split("(")[0]
new_type = type_map[i_type.split("(")[0]]
i_type = i_type.replace(old_type,new_type)
else:
print "Catch any case not in type_map:%s" % i_type if column in primary_key_l: # 列名存在主键数组中
i_type = i_type + ", primary_key=True"
s.append(" "+column + " = Column(" + i_type + ")")
for i in s[::-1]: # 反序输出
print i
输出结果:
class test_table(Base):
__tablename__ = "test_table"
id = Column(Integer(11), primary_key=True)
name = Column(String(64), primary_key=True)
password = Column(String(64))
sqlalchemy库官方文档:http://docs.sqlalchemy.org/en/latest/contents.html
sqlalchemy库官方文档(中文):http://www.cnblogs.com/iwangzc/p/4112078.html(感谢作者的分享)
faker库官方文档:https://faker.readthedocs.io/en/master/locales/zh_CN.html
faker库博客:https://www.jianshu.com/p/6bd6869631d9
脚本工具---自动解析mysql建表语句,生成sqlalchemy表对象声明的更多相关文章
- Python 一键拉取Git分支源码自动解析并执行SQL语句
基于Python实现自动拉取Git分支源码自动解析并执行SQL语句 by:授客 QQ:1033553122 1.代码用途 开发过程中,研发人员会提交SQL更新脚本到Git源码库,然后测试负责去拉取这些 ...
- MySQL建表语句生成Golang代码
1. 背景 对于后台开发新的需求时,一般会先进行各种表的设计,写各个表的建表语句 然后根据建立的表,写对应的model代码.基础的增删改查代码(基础的增删改查服务可以划入DAO(Data Access ...
- (转载)根据数据字典表定义的表结构,生成创建表的SQL语句
<来源网址:http://www.delphifans.com/infoview/Article_221.html>根据数据字典表定义的表结构,生成创建表的SQL语句 //1. 类名:T ...
- sqlserver数据库导出表结构和表数据生成创建表和insert语句
问题描述: 有时候我们只需要导出一张表和表数据到另外一个数据库,如果是备份整个库的话,就会很麻烦那样,没法满足需求. 解决方法: 以sqlserver2014为例:把MGActivity数据库的bat ...
- sqlacodegen:通过mysql语句生成sqlalchemy的model
引用网页描述:这个工具读取现有数据库的结构并生成相应的SQLAlchemy模型代码. 使用方法详细描述在如下连接中. 先简要介绍使用方法: 安装:pip install sqlacodegen sq ...
- SQL Server复制表结构和表数据生成新表的语句
参考:http://topic.csdn.net/t/20020621/09/820025.html SELECT * INTO newTableName FROM oldTabl ...
- shell脚本每天自动备份mysql数据库
一.mysql提供了一个mysqldump的工具可以方便的导出导入数据库信息: 二.使用命令行shell测试执行mysqldump,理解必备的参数,查看生成的sql备份文件是否符合需求: /usr/b ...
- MySQL 使用while语句向数据表中批量插入数据
1.创建一张数据表 mysql> create table test_while ( -> id int primary key) charset = utf8; Query OK, ro ...
- mysql数据库去重语句和不同表之间列的复制语句
1.去重语句:DELETE FROM `v_klg_item` WHERE id NOT IN (SELECT * FROM (SELECT MAX(id) FROM `v_klg_item` GRO ...
随机推荐
- less预编译语言使用总结
以前就使用过less和sass,其实很简单,就是很长时间不用,忘记语法了,现在来总结一片使用技巧 一.注释 less的注释不会被编译到css文件中,所以提倡多使用less中的注释:/**/ 二.变量 ...
- kali 2016:mount ntfs 分区只读 --Falling back to read-only mount because the NTFS partition is in an unsafe state.
mount ntfs 分区 mount /dev/sdb1 /mnt/d 提示: The disk contains an unclean file system (0, 0).Metadata ke ...
- 20145229吴姗珊《网络对抗》shellcode注入&Return-to-libc攻击深入
20145229吴姗珊<网络对抗>shellcode注入&Return-to-libc攻击深入(待上传) shellcode注入 shellcode是一段代码,是溢出程序和蠕虫病毒 ...
- SpringBoot Lombok
简介 lombok是一个编译级别的插件,它可以在项目编译的时候生成一些代码.比如日常开发过程中需要生产大量的JavaBean文件,每个JavaBean都需要提供大量的get和set方法,如果字段较多且 ...
- 修改Maven源为阿里巴巴的镜像
在C:\Users\Administrator\.m2创建setting.xml文件,内容如下 <settings xmlns="http://maven.apache.org/SET ...
- 使用shiro缓存用户身份信息的时候报:java.io.NotSerializableException: org.apache.shiro.util.SimpleByteSource
最近在使用shiro缓存用户的身份信息的时候,报了simpleByteSource不能序列化,跟进源码一看,原来这个类没有实现序列化的接口,但是我在缓存身份信息的实现又要用到这个类,解决方法:重写一个 ...
- Linux下同时复制多个文件
方法一 使用cp命令 cp /home/usr/dir/{file1,file2,file3,file4} /home/usr/destination/ 需要注意的是这几个文件之间不要有空格 具有共同 ...
- CNI:容器网络接口
CNI 简介 不管是 docker 还是 kubernetes,在网络方面目前都没有一个完美的.终极的.普适性的解决方案,不同的用户和企业因为各种原因会使用不同的网络方案.目前存在网络方案 flann ...
- MySQL无法启动几种常见问题小结
问题1:目录.文件权限设置不正确 MySQL的$datadir目录,及其下属目录.文件权限属性设置不正确,导致MySQL无法正常读写文件,无法启动. 错误信息例如: 复制代码 代码如下:[code] ...
- js 小复习1
1.数组 增删改查 , , , , ]; // arr.push(18); // 添加数组后面 更改长度 // arr.unshift(12); // 添加数组前面 // arr.pop(); // ...