2019独角兽企业重金招聘Python工程师标准>>>
数据库名 备注 最后修改时间
DB_TEST 测试库 2017/6/23
表样本和规范说明
话题分类 TopicClass
- 序号用公式=ROW()-4
- 类型只允许varchar, nvarchar, int, tinyint, bigint, datetime, decimal
- 长度 varchar, nvarchar, decimal 可设置长度
- 默认值char类都是双单引号'',int类都是0,decimal都是0.00,时间类型为getdate()或者'yyyy-MM-dd'
- 索引需要单独建立,暂时无法生成语句
- 时可为空 只允许NO或者空白
- 主键 只允许一个
- 备注中说明:具体说明,取值范围和说明,关联业务信息
这是样本
序号 英文名 类型 长度 默认值 索引 是否空 是否主键 说明 备注 样本备注(此项不必加入表字典中)
8 ClassID varchar 50 '' 1 NO 1 分类id
9 ClassName nvarchar 500 '' NO 分类名
10 PClassID varchar max '' NO 父级分类id
11 CreateTime datetime '1900-01-01' NO 发表时间
12 AddTime datetime getdate() NO 创建时间
13 IsSysClass int 0 NO 是否系统话题 1是系统话题/0不是系统话题
14 IsTopRecommend tinyint 1 NO 是否首页推荐 0不推荐/1推荐
15 IDPath bigint 0 NO ID路径 /分隔层级id
16 longitude varchar 32 '0' 1 NO 经度 经度用字符类型存储类似值 30.0123456789,主要考虑兼容性所以采用字符存储
17 latitude varchar 32 '0' 1 NO 纬度 纬度用字符类型存储类似值 103.0123456789
18 AddTime datetime getdate() NO 创建时间 属于元数据,主要用于追踪创建信息,需要程序功能配合
19 AddUser varchar 50 '' NO 创建人 属于元数据,主要用于追踪创建信息,需要程序功能配合
20 ModifyTime datetime getdate() NO 最后修改时间 属于元数据,主要用于追踪修改信息,需要程序功能配合
21 ModifUser varchar 50 '' NO 最后修改人 属于元数据,主要用于追踪修改信息,需要程序功能配合
22 IsDel int 0 NO 是否删除 1删除/0未删除 属于元数据,主要用于标记逻辑删除,需要勤维护和程序功能配合
用到了xlrd
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by weilai on 2017/06/23
"""exceltosql.py -- Excel数据库设计文档转换sql表创建sql工具"""
import xlrd
import datetime
version = 'ExcelToSql Excel数据库设计文档转换sql表创建sql工具 v 0.1.15'
sql_str = '';
prefix = 'HL_'
separator = ','
table_name = ''
# sql脚本 头部备注模板
sql_remark_template = """/****** [{table_remark}] DB: [{db_name}] Object: Table [dbo].[{table_name}] Script Date: {date_time} ******/"""
# 主体模板
create_sql_temp = """
{sql_remark}
USE [{db_name}]
GO
CREATE TABLE [dbo].[{table_name}]
({create_sql_body} {pk_template}) ON [PRIMARY]
GO
-- 备注信息
{remark_template}
-- 默认值
{def_template}
"""
# 主键的模板
pk_template = """CONSTRAINT [PK_{table_name}] PRIMARY KEY NONCLUSTERED
(
[{field_name}] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
"""
# 创表语句单项模板
item_template = """{field_name} {field_type} {is_null} {separator}
"""
# 备注信息写入的模板
remark_template = """EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'{field_remark}' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'{table_name}', @level2type=N'COLUMN',@level2name=N'{field_name}'
GO
"""
# 默认值写入的模板
def_val_template = """ALTER TABLE [dbo].[{table_name}] ADD CONSTRAINT [DF_{table_name}_{field_name}] DEFAULT ({default_value}) FOR [{field_name}]
GO
"""
# 生成sql文件名的模板
file_name_template = '{db_name}.{table_name}.CreateScript.sql'
# 以下是几个拿来装生成结果的公用字段,需要global声明一下
item_result = ''
def_val_result = ''
remark_result = ''
pk_result = ''
sql_remark_result = ''
def remark_filter(remark_str):
"""备注信息过滤,去除换行空格等无用内容"""
return remark_str.replace(' ', '').replace('\r', '').replace('\n', '').replace('\t', '')
def load_item_template(table_name, fields):
"""将每个数据项 转换组合到 主模板块中"""
global item_result,def_val_result,remark_result,pk_result
f_name = fields[1]
f_type = fields[2]
f_len = fields[3]
default_value = fields[4]
is_null = fields[6]
is_pk = fields[7]
remark = remark_filter(fields[8]+'|'+fields[9])
#
field_type = ''
if f_type=='varchar' or f_type == 'nvarchar':
if f_len == 'MAX':
field_type = '[{f_type}]({f_len})'.format(f_type=f_type,f_len=f_len)
else:
field_type = '[{f_type}]({f_len})'.format(f_type=f_type,f_len=int(f_len))
elif f_type=='int' or f_type=='tinyint' or f_type=='bigint':
field_type = '[{f_type}]'.format(f_type=f_type)
elif f_type=='decimal':
field_type = '[{f_type}]({f_len})'.format(f_type=f_type,f_len=f_len)
elif f_type=='money':
field_type = '[{f_type}]'.format(f_type=f_type)
else:
field_type = '[{f_type}]'.format(f_type=f_type)
null_template = ''
if is_null=='NO' or is_null==1 or is_null=='1':
null_template = 'NOT NULL'
else:
null_template = 'NULL'
# 字段项组合结果
item_result += item_template.format(field_name=f_name,field_type=field_type,is_null=null_template,separator=separator)
if default_value!='':
if f_type == 'int':
def_val_result += def_val_template.format(table_name=table_name,field_name=f_name,default_value='({0})'.format(int(default_value)))
else:
def_val_result += def_val_template.format(table_name=table_name,field_name=f_name,default_value=default_value)
remark_result += remark_template.format(table_name=table_name,field_name=f_name,field_remark=remark)
if is_pk==1:
pk_result = pk_template.format(table_name=table_name,field_name=f_name);
return item_result,def_val_result,remark_result,pk_result
def load_file(file_path):
"""读取excel文件"""
try:
data = xlrd.open_workbook(file_path)
return data
except Exception as e:
print(e)
def make_sql(file_path):
global item_result,def_val_result,remark_result,pk_result,sql_remark_result
data = load_file(file_path)
sheet_list = data.sheets()
sheets_len = len(sheet_list)
db_info = sheet_list[0]
db_name = db_info.row_values(1)[1]
print('/* 数据库:'+db_name+' */')
for ti in range(1, sheets_len - 3):
table = sheet_list[ti]
table_name = table.row_values(0)[1]
table_remark = table.row_values(0)[0]
item_result = ''
def_val_result = ''
remark_result = ''
pk_result = ''
sql_remark_result = ''
for i in range(4, table.nrows):
load_item_template(table_name, table.row_values(i))
#
d1 = datetime.datetime.now()
now_time = d1.strftime("%Y-%m-%d %H:%M:%S.%f")
sql_remark_result = sql_remark_template.format(table_remark=table_remark,db_name=db_name,table_name=table_name,date_time=now_time)
full_sql = create_sql_temp.format(sql_remark=sql_remark_result,db_name=db_name,table_name=table_name,create_sql_body=item_result,pk_template=pk_result,remark_template=remark_result,def_template=def_val_result)
file_path = file_name_template.format(db_name=db_name,table_name=table_name)
with open(path+file_path, 'w') as f:
f.writelines(full_sql)
print(full_sql)
# print('成功生成'+file_path+'创建表sql脚本...')
path = 'F:\\work\\code\\文档\\'
print('/* 生成路径:'+path+' */')
make_sql(path+'数据库功能设计文档.20170622.xlsx')
配合由数据库生成实体的功能,简化从文档到基本实体的工作