简单实现根据excel表生成sql 建表语句

根据Excel表数据 生成 sql建表语句

  • 实现字符串转成数据库属性名
  • 读取Excel数据,生成字符串列表
  • 生成数据库建表语句

实现字符串转成数据库属性名

源数据:
在这里插入图片描述

jieba 分词

通过结巴分词,对传入的字符串进行处理,分为一个个特定字符用于后续翻译。同时再生成分词后数组时,根据自己的需求对数据进行简单处理。我这里只做了去括号内内容处理。

# jieba分词(现在没有加语义标注,后期可以尝试添加)
def jiebaDeal(str):
    jieba.load_userdict(file_userdict_url) #导用户自定义词典
    splitlist=list(jieba.cut(str,cut_all=False))
    tagnum=0
    i=0
    while(i<len(splitlist)): #取出括号内的文字
      if splitlist[i] =='(':
          tagnum=1
      elif splitlist[i]==')':
          splitlist.pop(i)
          tagnum=0

      if tagnum==1:
        splitlist.pop(i)
        i=i-1

      
      i+=1
    return splitlist

效果
在这里插入图片描述

单词翻译

使用 谷歌 ,对单词进行翻译,刚开始尝试使用谷歌的包进行翻译,但效果不好,就找了一下别人的函数。
参考代码链接:
谷歌翻译

# 谷歌进行单词分词
def googleTranslate(text):
    
    url = 'https://translate.google.cn/_/TranslateWebserverUi/data/batchexecute?rpcids=MkEWBc&f.sid=-2984828793698248690&bl=boq_translate-webserver_20201221.17_p0&hl=zh-CN&soc-app=1&soc-platform=1&soc-device=1&_reqid=5445720&rt=c'
    headers = {
	    'origin': 'https://translate.google.cn',
	    'referer': 'https://translate.google.cn/',
	    'sec-fetch-dest': 'empty',
	    'sec-fetch-mode': 'cors',
	    'sec-fetch-site': 'same-origin',
	    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36',
	    'x-client-data': 'CIW2yQEIpbbJAQjEtskBCKmdygEIrMfKAQj2x8oBCPfHygEItMvKAQihz8oBCNzVygEIi5nLAQjBnMsB',
	    'Decoded':'message ClientVariations {repeated int32 variation_id = [3300101, 3300133, 3300164, 3313321, 3318700, 3318774, 3318775, 3319220, 3319713, 3320540, 3329163, 3329601];}',
	    'x-same-domain': '1'
	    }  
    data = {
        	'f.req': f'[[["MkEWBc","[[\\"{text}\\",\\"auto\\",\\"en\\",true],[null]]",null,"generic"]]]'
    	}  
    
    res = requests.post(url, headers=headers, data=data).text
    pattern = '\)\]\}\'\s*\d{3,4}\s*\[(.*)\s*' 

    part1 = re.findall(pattern, res)
    part1_list = json.loads('['+part1[0])[0]
    if part1_list[2] is None:  
        return text
    content1 = part1_list[2].replace('\n', '')
    part2_list = json.loads(content1)[1][0][0][5:][0]
    s = ''
    for i in part2_list:  
        s += i[0]
    return s

结果:
在这里插入图片描述

对词进行转化与处理

# 词处理
def enDeal(str):
    name=''
    for sinstr in str.split():
        if sinstr in nosenseWord or sinstr in nosenseBigword:
            continue
        elif name=='':
            name=name+sinstr
        else:
            name=name+'_'+sinstr
               
    return name.lower()

def enchange(str):
    name=''
    if(dictionary.get(str)==None):
        tempstr=googleTranslate(str)
        name=enDeal(tempstr)
        dictionary[str]=name
    else:
        name=dictionary.get(str)
    return name

词转属性名

# 单个词转化成属性名
def wordtoname(str):
    tempStr=''
    for trans in jiebaDeal(str):
        tempStr=tempStr+' '+enchange(trans)

    return enDeal(tempStr)

# 列表转化成 属性名
def exceltocol(excelList):
    # 分词后返回的二维数组
    namelist=[] 
    for str in excelList:   
        namelist.append(wordtoname(str))
  
    print(namelist)
    return namelist

在这里插入图片描述

读取Excel数据,生成字符串列表

#获取表的数据,并转化为建库所需数组
#所需参数:[table_page_num: 需要读取的sheet编号 ,start_col:用于数据生成的起始列 ,end_col:用于数据生成的起始列 ,
#          nameRow:用来生成属性名的行,dataRow:用来生成数据类型的行]
def get_table_data(table_page_num,start_col,end_col,nameRow,dataRow):  
    sheet=ef.sheet_by_index(table_page_num)   #获取第table_page_num 页  也可以通过sheet的名称进行获取,sheet_by_name('sheet名称')
    sql_data_type=[]   #数据类型
    sql_col_name=[]    #列名

    mysqlType=['varchar','varchar','decimal','date','boolean','varchar']
    
    #把表格内的数据转化成,符合规范的变量名
    sql_col_name=wordTrans.exceltocol(sheet.row_values(nameRow,start_col,end_col)) 
    for i in range(start_col,end_col):   
        #根据表格内的数据,获取变量类型
        temp_type_num=sheet.cell(dataRow,i).ctype 
        sql_data_type.append(mysqlType[temp_type_num])

    return [sql_col_name,sql_data_type]

生成数据库建表语句

# 表中字段生成语句
def fieldstatement(col_name,sql_Type):
    #根据列数据类型写入sql insert语句
    if sql_Type=="varchar":
        inser_param="`{0}` {1}(255) NULL ".format(col_name,sql_Type) 

    elif sql_Type=="decimal":
        inser_param="`{0}` {1}(10,2) NULL ".format(col_name,sql_Type)
        
    else:
        inser_param="`{0}` {1}".format(col_name,sql_Type)
    return inser_param

def create_table_statement(table_page_num,name_list,type_list):
    #创建sql语句
    createTableSql="CREATE TABLE {tableName}( \n".format(tableName=wordTrans.wordtoname(ef.sheet_names()[table_page_num]))
    for i in range(len(type_list)):
        #拼接建库语句
        inser_param=fieldstatement(name_list[i],type_list[i])
        if (i!=len(name_list)-1):
            inser_param+=','
            
        createTableSql=createTableSql+inser_param

    createTableSql+=')'

    return createTableSql


最终结果:
在这里插入图片描述
放在mysql 数据库中可运行

完整代码

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值