利用正则表达式对比数据库

前端之家收集整理的这篇文章主要介绍了利用正则表达式对比数据库前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

不是直接对比数据库,而是把数据库创建的sql导出来,对比sql,其实就是对比两个文本文件

import re

def getPowerFile():
    f = open("C:\\Users\\Administrator\\Desktop\\sql对比\\Z_T.sql","r")
    return f

def get主干数据库File():
    f = open("C:\\Users\\Administrator\\Desktop\\sql对比\\I_T.sql","r")
    return f

def getDict(file,pattern,offset):
    match = pattern.findall(file.read().lower())
    retDict = {}
    if match:
        for index in range(len(match)):
            #print(match[index])
            wordList = match[index].replace('\n',' ').replace(';',' ').split(' ')
            retDict[wordList[offset]] = match[index]
    return retDict

def dumpDict(tmpDict):
    for key in tmpDict:
        print("-------------------------------")
        print("key:",key)
        print("value:\n",tmpDict[key])
    #print("dict num : ",len(tmpDict))

def dumpList(tmpList):
    if not tmpList:
        print("空")
    tmpList.sort()
    for index in range(len(tmpList)):
        print(tmpList[index])
    #print("list num : ",len(tmpList))

def getNew(powerDict,主干数据库Dict):
    newList = []
    for key in powerDict:
        if key not in 主干数据库Dict:
            newList.append(key)
    return newList

def getChange(powerDict,主干数据库Dict):
    changeList = []
    for key in powerDict:
        if key in 主干数据库Dict:
            主干数据库tmp = re.sub('--.*?\n|\s+|,','',主干数据库Dict[key])
            主干数据库tmp = re.sub('/\*.*\*/',主干数据库tmp)
            powertmp = re.sub('--.*?\n|\s+|,powerDict[key])
            powertmp = re.sub('/\*.*\*/',powertmp)
            if 主干数据库tmp != powertmp:
                changeList.append(key)
    return changeList





#---------------------------generator----------------------------------
def handleGenerator():
    pattern = re.compile('create generator .*;\n.*;',re.M|re.I)
    powerDict = getDict(getPowerFile(),2)
    主干数据库Dict = getDict(get主干数据库File(),2)
    newList = getNew(powerDict,主干数据库Dict)
    changeList = getChange(powerDict,主干数据库Dict)
    print("目前Generator数目:",len(powerDict),"主干数据库目前Generator数目:",len(主干数据库Dict))
    print("新建Generator数目:",len(newList),"修改Generator数目:",len(changeList))
    print("新建Generator名列表:")
    dumpList(newList)
    print("\n修改Generator列表:")
    dumpList(changeList)
    print("\n修改Generator详细信息:")
    for index in range(len(changeList)):
        print("主干数据库:\n",主干数据库Dict[changeList[index]])
        print(":\n",powerDict[changeList[index]])
        print("\n")

#---------------------------procedure----------------------------------
def handleProcedure():
    pattern = re.compile('create or alter procedure .*?^end;',re.M|re.I|re.S)
    powerDict = getDict(getPowerFile(),4)
    主干数据库Dict = getDict(get主干数据库File(),4)
    newList = getNew(powerDict,主干数据库Dict)
    print("目前存储过程数目:","主干数据库目前存储过程数目:",len(主干数据库Dict))
    print("新建存储过程数目:","修改存储过程数目:",len(changeList))
    print("新建存储过程名列表:")
    dumpList(newList)
    print("\n修改存储过程列表:")
    dumpList(changeList)
    #for index in range(len(changeList)):
            #方便验证,不打印内容,只打印到returns,内容需要用beyondCampare比较
            #print("主干数据库:\n ",主干数据库match.group(0))
            #print(":\n ",powermatch.group(0)) 
            #print("主干数据库:\n ",主干数据库Dict[changeList[index]])
            #print(":\n ",powerDict[changeList[index]])
            #print("\n")
    print("\n")

#---------------------------trigger----------------------------------
def handleTrigger():
    pattern = re.compile('create or alter trigger .*?^end;',主干数据库Dict)
    print("目前触发器数目:","主干数据库目前触发器数目:",len(主干数据库Dict))
    print("新建触发器数目:","修改触发器数目:",len(changeList))
    print("新建触发器名列表:")
    dumpList(newList)
    print("\n修改触发器列表:")
    dumpList(changeList)
    print("\n修改触发器详细信息:")
    for index in range(len(changeList)):
        print("主干数据库:\n ",主干数据库Dict[changeList[index]])
        print(":\n ",powerDict[changeList[index]])
        print("\n")
    print("\n")

#---------------------------data 目前只处理 system_paramete 表新增数据----------------------------------
def handleData():
    pattern = re.compile('insert into system_parameter .*?;',9)
    主干数据库Dict = getDict(get主干数据库File(),9)
    newList = getNew(powerDict,主干数据库Dict)
    print("目前system_parameter数目:","主干数据库目前system_parameter数目:",len(主干数据库Dict))
    print("新建system_parameter数目:","修改system_parameter数目:",len(changeList))
    print("新建system_parameter列表:")
    for index in range(len(newList)):
        print(powerDict[newList[index]])

    print("\n修改system_parameter列表:")
    for index in range(len(changeList)):
        print("主干数据库:\n ",powerDict[changeList[index]])
        print("\n")
    print("\n")

#---------------------------table----------------------------------
def handleTable():
    pattern = re.compile('create table .*?;',2)
    tmpList = []
    for key in 主干数据库Dict:
        tmpList.append(key)
    #dumpList(tmpList)
    #dumpDict(主干数据库Dict)
    newList = getNew(powerDict,主干数据库Dict)
    #sql导出的表5张临时表没有统计,2张系统表多于
    print("目前表数目:",len(powerDict) + 5 - 2,"主干数据库目前表数目:",len(主干数据库Dict) + 5 - 2)
    print("新建表数目:","修改表数目:",len(changeList))
    print("新建表名列表:")
    dumpList(newList)
    print("\n修改表名明列表:")
    dumpList(changeList)
    print("\n")

#---------------------------table column----------------------------------
def getTableColumnDict(createTablesql):
    pattern = re.compile('^ .*?\n',re.M|re.I)
    match = pattern.findall(createTablesql.lower())
    retDict = {}
    if match:
        #print("match num:",len(match))
        for index in range(len(match)):
            #print(match[index])
            p = re.compile(r'\S+')
            wordList = p.findall(match[index])
            #print("size of dict:",len(wordList))
            retDict[wordList[0]] = match[index].rstrip(',')
    return retDict

def handleColumn():
    print("修改的表的详细信息:")
    pattern = re.compile('create table .*?;',2)
    for key in powerDict:
        if key in 主干数据库Dict and (powerDict[key] != 主干数据库Dict[key]):
            powerColumnDict = getTableColumnDict(powerDict[key])
            主干数据库ColumnDict = getTableColumnDict(主干数据库Dict[key])
            newList = getNew(powerColumnDict,主干数据库ColumnDict)
            changeList = getChange(powerColumnDict,主干数据库ColumnDict)
            print("修改的表名:",key)
            #dumpDict(powerColumnDict)
            print("主干数据库创建语句:\n",主干数据库Dict[key])
            print("表创建语句:\n",powerDict[key])
            print("新增","列:")
            dumpList(newList)
            #dumpDict(主干数据库ColumnDict)
            print("修改",len(changeList),"列:")
            dumpList(changeList)
            print("\n")
    print("\n")
    return

''' print("<html>") print("<body>") print("<p>") '''
handleTable()
handleColumn()
handleProcedure()
handleTrigger()
handleData()
handleGenerator()
''' print("</p>") print("</body>") print("</html>") '''

猜你在找的正则表达式相关文章