OOLY BLOG

柳絮纷飞
hey!

Python之在多个数据库批量执行Sql

前言

随着公司系统数据业务庞大,一个库已经会影响系统使用情况了。于是为了减轻服务器压力共分了26个数据库,其中25个为全国各省自己的数据。

这时候问题就来了,我做一个业务数据首先要在各省建好结果表,然后在通过数据工厂定时跑数据汇总至总库表。这样一来,我需要在26个数据库都建表。正常情况接下来就是手动复制26遍建表sql到各个库执行语句。这样还不算什么,那如果其中因为需求原因要临时改一个或多个字段名称,那我不得再次手动复制26遍sql到连接各个数据库。

这样下去我觉得我能累死,于是在网上了解了python可适用于自动化办公简化操作,自己试着写了下,实际使用下来确实代码较java来说简洁很多。只需要导个包几行代码就可连接数据库。这是极方便的。

准备工作

  1. 导包:json、cx_Oracle、time。分别用于解析json,连接oracle数据库,读取系统时间。
    2.准备txt数据源文件:sql_text.txt

代码展示

#-*- codeing = utf-8 -*-
#@Time :2020/12/12 15:26
#@Author : zh
#@File : con_oracle.py
#@Software: PyCharm

import json
import cx_Oracle
import time

result_count = 0
result_success=0
class my_plsql:
    def my_chat(self,sql,batch_lines):
        try:
            with open("./config/oracle_config.txt","r",encoding="utf-8") as f:
                dataList = f.read()
                #转换加载json
  arrayJs = json.loads(dataList)
                for mapDate in arrayJs:
                    global result_count
                    result_count += 1
  jdbcUrl = ''
  username = ''
  password = ''
  for key,value in mapDate.items():
                        if key=='jdbcUrl':
                            jdbcUrl = value[18:]
                        if key=='username':
                            username = value
                        if key=='password':
                            password = value
                    conn = cx_Oracle.connect(username, password, jdbcUrl)
                    cur = conn.cursor()
                    try:
                        if sql!='':
                            cur.execute(sql)
                            conn.commit()
                            print('已执行sql01')
                    except Exception as e:
                        print(jdbcUrl,"跳过建表结构,", e)
                        pass
 if batch_lines!='':
                        for line in batch_lines:
                            if line!='':
                                cur.execute(line)
                                conn.commit()
                                print('已执行sql02')
                    global result_success
                    result_success += 1
  print(jdbcUrl, "执行成功!")
        except (cx_Oracle.DatabaseError,Exception) as e:
            return print("执行失败,错误原因:",e)
        finally:
            f.close()

if __name__=='__main__':
   a = my_plsql()
   batch_lines = []
   start_time = time.perf_counter()
   #单段
  with open("./config/sql_text.txt","r",encoding="utf-8") as sql:
       sql_content = sql.read()
       #多段sql
  for line in open("./config/sql_text_batch_lines.txt", "r", encoding="utf-8"):
           batch_lines.append(line.replace('\n',''))
       if sql_content=='' and batch_lines=='':
           print('未发现sql语句')
       else:
           a.my_chat(sql_content,batch_lines)
       sql.close()
   print(f"总流程执行完毕,共计{result_count}个省,成功{result_count}个省。耗时:",(time.perf_counter()-start_time).__str__(),"ms")

文件结构如下:

结果展示:


完工,然后就可一键批量数据库执行sql了,这省的一大把时间提升效率在摸摸鱼岂不美哉。

转载文章请注明出处 | 当前页面:OOLY BLOG » Python之在多个数据库批量执行Sql

评论

captcha
请输入验证码