py读取excel文档数据库设计转换成mssql建表语句

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 

数据库名    备注  最后修改时间                          
DB_TEST   测试库 2017/6/23

表样本和规范说明
话题分类    TopicClass

  1. 序号用公式=ROW()-4
  2. 类型只允许varchar, nvarchar, int, tinyint, bigint, datetime, decimal
  3. 长度 varchar, nvarchar, decimal 可设置长度
  4. 默认值char类都是双单引号'',int类都是0,decimal都是0.00,时间类型为getdate()或者'yyyy-MM-dd'
  5. 索引需要单独建立,暂时无法生成语句
  6. 时可为空 只允许NO或者空白
  7. 主键 只允许一个
  8. 备注中说明:具体说明,取值范围和说明,关联业务信息 

  这是样本
序号  英文名 类型  长度  默认值 索引  是否空 是否主键    说明  备注  样本备注(此项不必加入表字典中)
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')

配合由数据库生成实体的功能,简化从文档到基本实体的工作

转载于:https://my.oschina.net/raddleoj/blog/1002611

你可能感兴趣的:(数据库,python)