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

该博客介绍了一种不直接对比数据库,而是通过导出数据库创建的SQL语句来对比两个数据库状态的方法,本质上是对两个文本文件进行比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不是直接对比数据库,而是把数据库创建的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(), pattern, 2)
    主干数据库Dict = getDict(get主干数据库File(), pattern, 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(), pattern, 4)
    主干数据库Dict = getDict(get主干数据库File(), pattern, 4)
    newList = getNew(powerDict, 主干数据库Dict)
    changeList = getChange(powerDict, 主干数据库Dict)
    print("目前存储过程数目:",len(powerDict),"主干数据库目前存储过程数目:",len(主干数据库Dict))
    print("新建存储过程数目:",len(newList),  "修改存储过程数目:",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;', re.M|re.I|re.S)
    powerDict = getDict(getPowerFile(), pattern, 4)
    主干数据库Dict = getDict(get主干数据库File(), pattern, 4)
    newList = getNew(powerDict, 主干数据库Dict)
    changeList = getChange(powerDict, 主干数据库Dict)
    print("目前触发器数目:",len(powerDict),"主干数据库目前触发器数目:",len(主干数据库Dict))
    print("新建触发器数目:",len(newList),  "修改触发器数目:",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 .*?;', re.M|re.I|re.S)
    powerDict = getDict(getPowerFile(), pattern, 9)
    主干数据库Dict = getDict(get主干数据库File(), pattern, 9)
    newList = getNew(powerDict, 主干数据库Dict)
    changeList = getChange(powerDict, 主干数据库Dict)
    print("目前system_parameter数目:",len(powerDict),"主干数据库目前system_parameter数目:",len(主干数据库Dict))
    print("新建system_parameter数目:",len(newList),  "修改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 ", 主干数据库Dict[changeList[index]])
        print(":\n ", powerDict[changeList[index]])
        print("\n")
    print("\n")

#---------------------------table----------------------------------
def handleTable():
    pattern = re.compile('create table .*?;', re.M|re.I|re.S)
    powerDict = getDict(getPowerFile(), pattern, 2)
    主干数据库Dict = getDict(get主干数据库File(), pattern, 2)
    tmpList = []
    for key in 主干数据库Dict:
        tmpList.append(key)
    #dumpList(tmpList)
    #dumpDict(主干数据库Dict)
    newList = getNew(powerDict, 主干数据库Dict)
    changeList = getChange(powerDict, 主干数据库Dict)
    #sql导出的表5张临时表没有统计,2张系统表多于
    print("目前表数目:",len(powerDict) + 5 - 2,"主干数据库目前表数目:",len(主干数据库Dict) + 5 - 2)
    print("新建表数目:",len(newList),  "修改表数目:",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 .*?;', re.M|re.I|re.S)
    powerDict = getDict(getPowerFile(), pattern, 2)
    主干数据库Dict = getDict(get主干数据库File(), pattern, 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("新增", len(newList), "列:")
            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>")
'''

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值