使用Python将sql文件刷入DB

Python学习第二弹

#coding = UTF-8

import os, sys, time, shutil

class NdbFlush:
    def __init__(self):
        self._ROOT_PATH_ = None
        self._TNS_LIST_ = {}
        self._FILE_LIST_ = {} # {SCHEMA:{‘TAB‘:[], ‘SEQ‘:[], ‘PKGH‘:[]}, SCHEMA:{...}, ...}
        self._ORA_CFG_FILE_ = None
    def _UnInit_(self):
        self._ROOT_PATH_ = None
        self._TNS_LIST_ = None
        self._FILE_LIST_ = None
        self._ORA_CFG_FILE_ = None
        

    #######################################
    # 设置路径
    #######################################
    def GetFilePath(self):
        expath = os.getcwd()
        if os.path.isdir(expath):
            return expath
        elif os.path.isfile(expath):
            return os.path.dirname(expath)

    #######################################
    # 获取连接串列表
    #######################################
    def GetOraInfo(self):
        ora_file = self._ROOT_PATH_ + ‘/‘ + self._ORA_CFG_FILE_
        tns_list = {}
        fh = open(ora_file, ‘r‘)
        for ora in fh.readlines():
            ora = ora.replace(‘\n‘, ‘‘)
            if ora and len(ora) > 5:
                ora_list = []
                schema = ora.split(‘/‘)[0].upper()
                ora_list = tns_list.get(schema)
                if (ora_list and len(ora_list) > 0):
                    ora_list.append(ora)
                else:
                    ora_list = [ora]
                tns_list[schema] = ora_list
        return tns_list

    #######################################
    # 将SQL文件名称加载到列表中
    #######################################
    def LoadNdbList(self, _list_):
        #print(‘[LoadNdbList] _list_ =‘, _list_, ‘\tlen(_list_)‘, len(_list_))
        lst = {}
        try:
            for itm in _list_:
                #print(‘\tITM =‘, itm)            
                file_split = itm.split(‘_‘)
                #print(‘\tfile_split[0] =‘, file_split[0], ‘\tfile_split[1] =‘, file_split[1])
                #schema = {}
                files = []
                schema = lst.get(file_split[1].upper())
                #print(‘\tschema =‘, schema)
                if schema and len(schema) > 0:
                    files = schema.get(file_split[0])
                    #print(‘\t\tfiles =‘, files)
                    if files and len(files) > 0:
                        files.append(itm)
                        schema[file_split[0]] = files
                        #print(‘\t\t\tfiles 1 =‘, files)
                        #print(‘\t\t\tschema =‘, schema)
                    else:
                        files = [itm]
                        schema[file_split[0]] = files
                        #print(‘\t\t\tfiles 2 =‘, files)
                else:
                    #print(‘\t‘, schema, file_split[0], itm)
                    schema = {}
                    files =[itm]
                    schema[file_split[0]] = files
                #print(‘\tschema =‘, schema)
                lst[file_split[1].upper()] = schema
                #print(‘\tLST =‘, lst)
                #print(‘-‘ * 80)
        except Exception as e:
            #print(‘请传入数组类参数(如:元组[])\n‘)
            print(e)
            lst = {}
        #print(lst)
        return lst

    #######################################
    # 获取SQL文件列表
    #######################################
    def GetSqlFileList(self):
        filelist = []
        sqlPath = self._ROOT_PATH_ + ‘/files/‘
        for file in os.listdir(sqlPath):
            if file[-4:].upper() == ‘.SQL‘:
                if filelist:
                    filelist.append(file)
                else:
                    filelist = [file]
        #print(‘\n\n‘, filelist, ‘\n\n‘)
        print(‘在目录[‘ + sqlPath + ‘]下找到[%d]个SQL文件‘ % len(filelist))
        return filelist

    #######################################
    # 将SQL刷入DB
    #######################################
    def SqlFlushDB(self, _runMode_ = ‘M‘):
        # schema loop
        file_list = self._FILE_LIST_
        ora_list = self._TNS_LIST_
        filePath = self._ROOT_PATH_ + ‘/files/‘
        for im in file_list:
            #print(‘schema =‘, im)#, lst.get(im))
                
            # file type loop begin
            # SEQ
            for xm in file_list.get(im):
                #print(‘\ttype =‘, xm, ‘\n\tlist =‘, file_list.get(im).get(xm))
                if ‘SEQ‘ == xm.upper():
                    self.InitBat(im, file_list, ora_list, filePath, xm, _runMode_)
            # TAB
            for xm in file_list.get(im):
                #print(‘\ttype =‘, xm, ‘\n\tlist =‘, file_list.get(im).get(xm))
                if ‘TAB‘ == xm.upper():
                    self.InitBat(im, file_list, ora_list, filePath, xm, _runMode_)
            # TAB
            for xm in file_list.get(im):
                #print(‘\ttype =‘, xm, ‘\n\tlist =‘, file_list.get(im).get(xm))
                if ‘PKGH‘ == xm.upper():
                    self.InitBat(im, file_list, ora_list, filePath, xm, _runMode_)
            # not in (TAB, SEQ)
            for xm in file_list.get(im):
                #print(‘\ttype =‘, xm, ‘\n\tlist =‘, file_list.get(im).get(xm))
                if ‘TAB‘ != xm.upper() and ‘SEQ‘ != xm.upper() and ‘PKGH‘ != xm.upper():
                    self.InitBat(im, file_list, ora_list, filePath, xm, _runMode_)
            # file type loop end

    def InitBat(self, _schema_, _fileList_, _oraList_, _filePath_, _fileType_, _runMode_ = ‘M‘):
        # file name loop
        for file in _fileList_.get(_schema_).get(_fileType_):
            #print(‘\t\t‘, file)
            filePath = _filePath_
            sqlpath = filePath + file
            fh = open(sqlpath, ‘a+‘)
            fh.write(‘\nexit‘)
            fh.close()

            tnslst = ‘‘
            # ora conf loop
            fht = open(sqlpath + ‘.bat‘, ‘a+‘)
            fht.write(‘title [‘ + file + ‘]\necho off\n‘)
            fht.write(‘cd ‘ + filePath + ‘\n‘)
            fht.write(‘cls\n\n\n‘)
            # tns loop
            for tns in _oraList_.get(_schema_):
                #print(‘\t\t\t‘, tns)
                tnslst += tns + ‘, ‘
                fht.write((‘@echo "[ %s ]‘ %file) + (‘ -> [ %s]"‘ %tns) + ‘\n\n‘)
                fht.write(‘@echo 刷库中...\n\n‘)
                fht.write(‘sqlplus ‘ + tns + ‘ @‘ + file + ‘ >> ‘ + file + ‘.log\n\n\n‘)
                fht.flush()
            #fht.write(‘@pause\n‘)
            fht.write(‘@echo FINISH>‘ + file + ‘.ok‘)
            fht.write(‘\n\nexit‘)
            fht.close()
            print((‘[ %s ]‘ %file) + (‘ -> [ %s]‘ %tnslst))
            if _runMode_ == ‘M‘:
                self.RunBat(sqlpath, _runMode_)
            else:
                os.system(r‘‘ + sqlpath + ‘.bat‘)
            #time.sleep(1)

            try:
                fhl = open(r‘‘ + sqlpath + ‘.log‘, ‘r‘)
                lines = fhl.readlines()
                lineidx = 0
                errFlag = False
                fhl.close()
                for line in lines:
                    lineU = line.upper()
                    if lineU.find(‘ERROR‘) >= 0:
                        errFlag = True
                        break
                    lineidx += 1
                if errFlag:
                    print(‘\t>>[Status] Failed..‘)
                    print(‘\t  [ ‘ + lines[lineidx].replace(‘\n‘, ‘‘) + ‘ ]‘)
                    print(‘\t  [ ‘ + lines[lineidx + 1].replace(‘\n‘, ‘‘) + ‘ ]‘)
                else:
                    print(‘\t>>[Status] Success..‘)
                    if os.path.isfile(r‘‘ + sqlpath + ‘.log‘):
                        os.remove(r‘‘ + sqlpath + ‘.log‘)
                        shutil.move(sqlpath, sqlpath.replace(‘/files/‘, ‘/finish/‘))
            except Exception as e:
                print(‘\t程序异常:‘, e)
                    
            print(‘-‘ * 70)

    def RunBat(self, _fileName_, _runMode_):
        state = ‘START‘
        while True:
        #print(runnext)
            if state == ‘START‘:
                os.system(‘start ‘ + r‘‘ + _fileName_ + ‘.bat‘)
                state = ‘RUNNING‘
                #print(1)
            elif state == ‘FINISH‘:
                #print(9)
                break
            elif state == ‘RUNNING‘:
                time.sleep(1)
                #print(2)
                try:
                    fh = open(r‘‘ + _fileName_ + ‘.ok‘, ‘r‘)
                    state = fh.read().replace(‘\n‘, ‘‘)
                except:
                    state = ‘RUNNING‘
            else:
                break
            
    
    def CleanFile(self, _mode_ = ‘Finish‘):
        tmpPath = self._ROOT_PATH_ + ‘/files/‘
        for file in os.listdir(tmpPath):
            ffff = file.upper()
            delFlag = False
            if _mode_ == ‘Finish‘:
                if ffff[-4:] == ‘.BAT‘ or ffff[-7:] == ‘.SQL.OK‘:
                    delFlag = True
            else:
                if ffff[-4:] == ‘.LOG‘ or ffff[-4:] == ‘.BAT‘ or ffff[-7:] == ‘.SQL.OK‘:
                    delFlag = True
            if delFlag:
                tmpFile = os.path.join(tmpPath,  file) 
                if os.path.isfile(tmpFile):
                    os.remove(tmpFile)
            
    def Launcher(self):
            
        #l = [‘tab_lpms_xxx.sql‘, ‘tab_lpms_xx1x.sql‘, ‘tab_lpms_xxxxx.sql‘, ‘tab_wlt_xxx.sql‘, ‘seq_lpms_xxx.sql‘, ‘pkgh_jone_xxx.sql‘, ‘pkgb_jone_xxx.sql‘, ‘pubk_jone_xxx.sql‘]
        #self._FILE_LIST_ = self.LoadNdbList(l)
        # 清理历史bat文件

        self._ROOT_PATH_ = self.GetFilePath().replace(‘\\‘, ‘/‘)
        print(‘工作目录:‘, self._ROOT_PATH_)

        _clean_ = True
        _show_list_ = False
        _dosMode_ = ‘M‘
        #workp = ‘D:/NdbFlush‘
        ipt = input(‘>>‘)
        ipt = ipt.upper()
        if ipt == ‘V‘:
            _show_list_ = True
        elif ipt == ‘D1‘:
            _dosMode_ = ‘S‘
        elif ipt == ‘D2‘:
            _dosMode_ = ‘M‘           
        elif ipt == ‘Q‘:
            exit()
        elif ipt == ‘C‘:
            _clean_ = True
        else:
            print(‘将以默认方式执行...‘)
        print(‘=‘ * 70)
        print(‘\n\n‘)
        
        self.CleanFile(‘Begin‘)

        self._FILE_LIST_ = self.LoadNdbList(self.GetSqlFileList())

        # 显示文件清单 BEGIN
        if _show_list_:
            lst = self._FILE_LIST_
            for im in lst:
                # schema
                print(‘schema =‘, im)#, lst.get(im))
                for xm in lst.get(im):
                    # file type
                    print(‘\ttype =‘, xm, ‘\n\tlist =‘, lst.get(im).get(xm))
        # 显示文件清单 END
        
        self._ORA_CFG_FILE_ = ‘ora_tns_info.conf‘
        self._TNS_LIST_ = self.GetOraInfo()        

        self.SqlFlushDB(_dosMode_)

        if _clean_:
            self.CleanFile()

        self._UnInit_()
        return self._FILE_LIST_, self._TNS_LIST_

       

def usage():
    print(‘=‘ * 70)
    print(‘=\t[ NDB 刷库工具 ] v1.0‘)
    print(‘=\t2015-07-05 by L‘)
    print(‘-‘ * 60)
    print(‘=\t[ Q: 退出; ]‘)
    print(‘=\t[ V: 显示录库的SQL列表; ]‘)
    print(‘=\t[ D1: 单窗口执行; D2:多窗口执行[默认]; ]‘)
    print(‘=\t[ \t执行前请确保: ‘)
    print(‘=\t \t\t1)SQL:[$WorkPath$/files/]‘)
    print(‘=\t \t\t2)TNS:[$WorkPath$/ora_tns_info.conf]‘)
    print(‘=\t[ 回车继续; ]‘)
    print(‘=‘ * 70)
    
if __name__ == ‘__main__‘:
    usage()
    
    ndb = NdbFlush()
    lst, ora = ndb.Launcher()

    print(‘\n\n‘)
    print(‘=‘ * 70)
    print(‘\n‘)
    print(‘刷库动作完毕,执行结果详见上面日志,失败信息已写入对应log文件$WorkPath$/file/*.log...\n[Enter]‘)
    input(‘‘)
    
   
    ‘‘‘
    print(‘[MAIN] lst =‘, lst)
    print(‘[MAIN] ora =‘, ora)
    print(‘\n\n‘)
    
    print(‘\n\n\n\n‘)
    print(‘-‘ * 100)
    print(‘\n\n\n\n‘)
    for im in lst:
        # schema
        print(‘schema =‘, im)#, lst.get(im))
        for xm in lst.get(im):
            # file type
            print(‘\ttype =‘, xm, ‘\n\tlist =‘, lst.get(im).get(xm))
    ‘‘‘
时间: 2024-08-12 06:16:21

使用Python将sql文件刷入DB的相关文章

python分割sql文件

之前用joomla帮一学校做了个网站,然后要部署到他们到服务器上,他们只提供了sftp和phpmyadmin的账号,上传网站文件倒是挺顺利的,但后来用phpmyadmin导入mysql数据就遇到问题了:由于他们设置的phpmyadmin最大只能导入2M的sql文件,如果太大会导致无法导入成功,但是我的sql文件有17M呀--------- 没得办法,只能分割sql文件了,初学python,于是就当练习,用python写了个分割sql文件的脚本: #由于导出的sql文件总共95张表,每张表前都有这

python代码执行SQL文件(逐句执行)

一.简介 关于Python如何连接数据库并执行SQL语句,几乎所有的Python教程都会讲,教程里基本只介绍了执行单条SQL语句的方法,但是实际生产过程中可不只是执行一两条语句,动辄几十条甚至上百条的SQL语句,一个.SQL的SQL文件正常都会包含多条SQL语句,如果把这些SQL语句直接贴进Python代码文件,势必会影响代码的可读性和美感,代码量也冗余,那么Python能不能像oracle的PL/SQL客户端或者navicat一样读取SQL文件并且执行会是一件非常有趣的事情. 经过不断百度和尝

AOSP Google Nexus6P- angler刷入官方ROM-IMG文件

Pro01 OTA方式升级官方ROM ROM:angler-nrd90m-47-ota-android7.0.zip 教程:使用adb sideload刷入安卓7.0/6.0.1 OTA包办法 主要步骤: Step1. 开发者选项中打开设备的USB调试模式? Step2. 设备关机后,按住"音量下"键(不松开)后按住"电源"键,进入fastboot模式: Step3. fastboot模式下,按几下"音量下(或上)",在看到"Recov

Android编程心得-在Assets文件夹中放入.sql文件实现创建SQlite表的操作

当我们在使用SQLiteOpenHelper时,经常使用db.execSQL(String sql)方法写入对应语句实现创建表的操作,这样的确可以实现业务逻辑.与此同时还有一种更灵活的方法,从assets文件夹下读取对应的.sql文件,然后创建表. 1.首先在工程的assets文件夹下,添加对应的.sql文件 2.配置一个Configuration类,用于保存固定路径变量 [java] view plaincopy public class Configuration { public stat

导入.sql文件入数据库

1.创建数据库,例如abc create database abc; 2.进入数据库 use abc 3.导入e盘下的ssh.sql文件即可 source e:\ssh.sql; 截图如下:

MySQL导入.sql文件及常用命令

在MySQL Qurey   Brower中直接导入*.sql脚本,是不能一次执行多条sql命令的,在mysql中执行sql文件的命令: mysql> source   d:/myprogram/database/db.sql; 另附mysql常用命令: 一) 连接MYSQL: 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL 首先在打开DOS窗口,然后进入mysql安装目录下的bin目录下,例如: D:/mysql/bin,再键入命令mysql -

php导入sql文件

sql php php导入sql文件 基本思路 1.打开sql文件,放入一个变量(字符串类型)当中 2.使用正则替换掉当中的注释("--"与"/**/") 3.使用explode分割成为一个数组并去除每行的空格 4.链接数据库之后使用my_query()执行sql 代码 <?php // +--------------------------------------------------------------------------------------

MySQL导入SQL文件及常用命令

  在MySQL Qurey   Brower中直接导入*.sql脚本,是不能一次执行多条sql命令的,在mysql中执行sql文件的命令: mysql> source   d:/myprogram/database/db.sql; 另附mysql常用命令: 一) 连接MYSQL: 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL 首先在打开DOS窗口,然后进入mysql安装目录下的bin目录下,例如: D:/mysql/bin,再键入命令mysql

Python读取SQLite文件数据

近日在做项目时,意外听说有一种SQLite的数据库,相比自己之前使用的SQL Service甚是轻便,在对数据完整性.并发性要求不高的场景下可以尝试! 1.SQLite简介: SQLite是一个进程内的库,实现了自给自足的.无服务器的.零配置的.事务性的 SQL 数据库引擎.它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它(如安卓系统),它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多