脚本工具---自动解析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 ...
随机推荐
- jQuery带缩略图的宽屏焦点图插件
在线演示 本地下载
- HTML5堆木头游戏
在线演示 本地下载
- jQuery双向滑动杆 设置数值百分比
在线演示 本地下载
- String创建方式的区别
String str0 = "abc"; String str1 = new String("abc"); 第一句执行后,会在String pool中创建一个& ...
- grable编译spring源码并导入eclipse
1.下载安装gradle, spring 源码构建加入了gradle支持. gradle下载: http://www.gradle.org/downloads ,下载后设置环境变量: GRADLE_H ...
- 图论_FatherChristmasFlymouse(Tarjan+dijkstra or spfa)
堆优化Dij VS Spfa 堆优化Dij小胜一筹. 题目名字:Father Christmas flymouse (POJ 3160) 这题可以说是图论做的比较畅快的一题,比较综合,很想说一说. 首 ...
- Hive-开启动态分区
开启动态分区 --开启动态分区 set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict ...
- ik分词器
ik分词器下载地址:https://code.google.com/archive/p/ik-analyzer/downloads 需要FQ 配置文件: IKAnalyzer2012.jar(主 ja ...
- 指定library路径
1.执行 ?.jar文件: 1.1.“java -jar ?.jar” 1.2.如果 ?.jar里面使用了JNI调用了 ?.dll/?.so 等文件,可能会报错 找不到相关的 库文件,如果这样的话,可 ...
- java处理HTTP请求
import com.diyfintech.wx.service.HttpService; import org.springframework.stereotype.Service; import ...