不是直接对比数据库,而是把数据库创建的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>") '''

利用正则表达式对比数据库的更多相关文章

  1. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. 详解前端HTML5几种存储方式的总结

    本篇文章主要介绍了前端HTML5几种存储方式的总结 ,主要包括本地存储localstorage,本地存储sessionstorage,离线缓存(application cache),Web SQL,IndexedDB。有兴趣的可以了解一下。

  3. PhoneGap / iOS上的SQLite数据库 – 超过5mb可能

    我误解了什么吗?Phonegap中的sqlitedbs真的有5mb的限制吗?我正在使用Phonegap1.2和iOS5.解决方法您可以使用带有phonegap插件的原生sqliteDB,您将没有任何限制.在iOS5.1中,Websql被认为是可以随时删除的临时数据…

  4. ios – 领域:如何获取数据库的当前大小

    是否有RealmAPI方法使用RealmSwift作为数据存储来获取我的RealmSwift应用程序的当前数据库大小?

  5. ios – 使用大写符号在字符串swift中获取URL的正则表达式

    我尝试在文本中获取URL.所以,在此之前,我使用了这样一个表达式:但是当用户输入带有大写符号的URL时(例如Http://Google.com,它与它不匹配)我遇到了问题.我试过了:但什么都没发生.解决方法您可以使用正则表达式中的i内联标志关闭区分大小写,有关可用正则表达式功能的详细信息,请参阅FoundationFrameworkReference.(?ismwx-ismwx)Flagsetti

  6. ios – Realm – 无法使用现有主键值创建对象

    我有一个对象有许多狗的人.应用程序有单独的页面,它只显示狗和其他页面显示人的狗我的模型如下我有人存储在Realm中.人有详细页面,我们取,并显示他的狗.如果狗已经存在,我会更新该狗的最新信息并将其添加到人的狗列表中,否则创建新狗,保存并将其添加到人员列表中.这适用于coredata.在尝试用他的狗更新人时,领域会抛出异常无法使用现有主键值创建对象解决方法这里的问题是,即使你正在创建一个全新的Rea

  7. ios – UIWebView中的WebSQL / SQLite数据库的最大大小(phonegap)

    我知道一般来说,Web应用程序的本地存储空间有5MB的限制.本地网页浏览应用程式是否也有这个限制?

  8. ios – 如何在Swift 3中使用正则表达式?

    解决方法我相信.当没有其他选项适用时,将使用.allZeros.因此,使用Swift3,您可以传递一个空的选项列表或省略options参数,因为它默认为无选项:要么请注意,在Swift3中,您不再使用error参数.它现在抛出.

  9. ios – Firebase离线存储高级 – 手动同步和进度信息

    >我可以提供一个捆绑数据库–安装App后我可以已经离线查询了Firebase数据?然后我有另一个关于Firebase的主要问题:>JSON存储是伟大的–但是这样我们不关心一个独特的结构,我们必须注意这一点插入总是正确的数据集?我从来没有试图显示实际的进展,但是当您从firebase中检索数据时,始终会在成功检索数据时调用onDataChange方法.https://firebase.google.com/docs/database/android/retrieve-data#read_data_onceC

  10. ios – lldb断点在类目标c中的所有方法

    如何使用lldb在ObjectiveC类中的所有方法上自动设置断点?

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部