首页 > 数据库 >python连接Oracle数据库实现数据查询并导入MySQL数据库

python连接Oracle数据库实现数据查询并导入MySQL数据库

时间:2023-07-03 18:12:02浏览次数:39  
标签:map elif PATTERNID name python 数据库 MySQL Oracle

1. 项目背景

由于项目需要连接第三方Oracle数据库,并从第三方Oracle数据库中查询出数据并且显示,而第三方的Oracle数据库是Oracle11的数据库。而django4.1框架支持支持 Oracle 数据库服务器 19c 及以上版本,需要 7.0 或更高版本的 cx_Oracle Python 驱动;django3.2支持 Oracle 数据库服务器 12.2 及以上版本。需要 6.0 或更高版本的 cx_Oracle Python 驱动。这就很矛盾。。。。。所以领导建议不要用django框架去连Oracle数据库,而是使用python代码去连接Oracle,以防报错

2. 代码实现

def vote_test():
    query = Votes.objects.all()
    colname = [field.name for field in Votes._meta.get_fields()]
    os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.AL32UTF8'
    connections = cx_Oracle.connect('GYDC', '123456', '192.168.110.200:1521/HELOWIN')
    if query:
        sheets = []
        local_sheets = []
        last_id = Votes.objects.last().id
        Ear_time = Votes.objects.values().order_by("PERMITSTARTTIME").first()
        with connections.cursor() as cursor:
            cursor.execute("""SELECT SHEETID from GYDC.WS_SHEETINDEX
                 WHERE
                   (PATTERNID = 47 or PATTERNID = 48 or PATTERNID = 49 or PATTERNID = 50 or PATTERNID = 65 or PATTERNID = 58 or PATTERNID = 62 or PATTERNID = 68) and
                   ISMAINSHEET = 1 and
                   SHEETTYPE = 1 and
                   TO_DATE('%s', 'YYYY-MM-DD HH24:MI:SS')<= TO_DATE(PERMITSTARTTIME, 'YYYY-MM-DD HH24:MI:SS') and
                       TO_DATE(PERMITSTARTTIME, 'YYYY-MM-DD HH24:MI:SS') < sysdate and
                   ENDTIME is null""" %(Ear_time["PERMITSTARTTIME"],))
            vote_data = cursor.fetchmany()
            for i in vote_data:
                sheets.append(int(i[0]))
        local_data = Votes.objects.values("SHEETID").all()
        for vote in local_data:
            local_sheets.append(vote["SHEETID"])
        for sheet in set(local_sheets)-set(sheets):
            Votes.objects.filter(SHEETID = sheet).delete()
        for sheet in set(sheets)-set(local_sheets):
            with connections.cursor() as cursor:
                cursor.execute("""SELECT * from GYDC.WS_SHEETINDEX WHERE SHEETID = '%s'""" % (sheet))
                vote_data = cursor.fetchmany()
                map = data_clear(colname,vote_data,last_id)
                # print(map)
                Votes.objects.create(**map[0])
    else:
        objs = []
        with connections.cursor() as cursor:
            cursor.execute("""SELECT * from GYDC.WS_SHEETINDEX
        WHERE
          (PATTERNID = 47 or PATTERNID = 48 or PATTERNID = 49 or PATTERNID = 50 or PATTERNID = 65 or PATTERNID = 58 or PATTERNID = 62 or PATTERNID = 68) and
          ISMAINSHEET = 1 and
          SHEETTYPE = 1 and
          sysdate - interval '30' day < TO_DATE(PERMITSTARTTIME, 'YYYY-MM-DD HH24:MI:SS') and
          ENDTIME is null""")
            vote_data = cursor.fetchall()
            map = data_clear(colname,vote_data,0)
            # Votes.objects.create(**map)
            for i in range(0,len(map)):
                objs.append(Votes(**map[i]))
        Votes.objects.bulk_create(objs)

上述代码是逻辑实现,目的是通过这个方法实现我们的数据库与第三方库的同步,拟后端通过5-10分钟的定时任务,定时从第三方库中获取正在进行的数据,并将正在进行的数据导入我闷的MySQL数据库

def data_clear(local_col,vote_value,maxid):
    maps =[]
    for vote in vote_value:
        map = dict(zip(local_col[1:-9], vote))
        for key, value in map.items():
            if key in ["MAKETIME", "PLANSTARTTIME", "PLANFINISHTIME", "RECEIVETIME", "PERMITSTARTTIME",
                       "APPROVESTARTTIME", "APPROVEWORKTIME", "APPROVEFINISHTIME", "DELAYTIME", "ENDTIME",
                       "TOTALOPERTIMES", "ACTUALOPERTIMES", "LASTOPERATETIME", "NEWPAGENUMTIME", "start_time",
                       "end_time"]:
                if value:
                    value = datetime.datetime.strptime(value, '%Y-%m-%d %H:%M:%S')
                    map[key] = value
                else:
                    map[key] = None
        if map["PATTERNID"] == 47:
            map["name"] = "电气1"
        elif map["PATTERNID"] == 48:
            map["name"] = "电气2"
        elif map["PATTERNID"] == 49:
            map["name"] = "热力1"
        elif map["PATTERNID"] == 50:
            map["name"] = "热力2"
        elif map["PATTERNID"] == 65:
            map["name"] = "热控1"
        elif map["PATTERNID"] == 58:
            map["name"] = "热控2"
        elif map["PATTERNID"] == 62:
            map["name"] = "电气倒闸"
        elif map["PATTERNID"] == 68:
            map["name"] = "热力机械"
        elif map["PATTERNID"] == 6:
            map["name"] = "综合操作"
        map['id'] = maxid + 1
        maxid += 1
        maps.append(map)
    print(maps)
    return maps

标签:map,elif,PATTERNID,name,python,数据库,MySQL,Oracle
From: https://www.cnblogs.com/beijie/p/17523606.html

相关文章

  • mysql拓展
    事务定义就是将一组SQL语句放在同一批次内去执行如果一个sql语句出错,则改批次内的所有sql都将被取消执行 (1)原子性 一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作,这就是事务的原子性 (2)一致性 在事务开始之前和事务结束以后,数据库的完整性没......
  • 简单的python面向对象案例——跑步或吃饭
    个人学习,仅供参考要求对象:小明a.属性:姓名,体重b.方法:跑步,吃东西(每次跑步会减掉0.1kg,每次吃东西增加0.2kg)输入名字以初始体重选择跑步或吃东西,输入次数打印当前体重代码如下:#定义一个类classPerson(object):#公共属性def__init__......
  • 在Jupyter笔记本中使用Python与GPT-4进行交互
    在这篇文章中,我们将讨论如何在Jupyter笔记本中使用Python与GPT-4(一种强大的自然语言处理模型)结合进行处理。尽管OpenAI并未特地发布名为"GPT-4"的模型,但我们可以使用现有的GPT-3作为参考。如OpenAI未来发布了GPT-4,其与GPT-3的用法将会非常相似。在Jupyter笔记本中使用Python与GPT......
  • mysql查看表容量大小
    1.查看所有数据库容量大小selecttable_schemaas'数据库',sum(table_rows)as'记录数',sum(truncate(data_length/1024/1024,2))as'数据容量(MB)',sum(truncate(index_length/1024/1024,2))as'索引容量(MB)'frominformation_schema.tablesgr......
  • 阿里数据库内核月报
    数据库内核月报2023/06MySQL·源码解析·并发Replaceinto导致死锁MySQL·源码解析·mysql子查询执行方式介绍极致性价比:自研数据库PolarDBon自研芯片倚天2023/05MySQL·源码解析·InnoDB中undo日志的组织及实现PolarDB·引擎特性·DDL中MDL锁的优化和演......
  • 记一次python消费kafka进程持续消耗内存问题
    前提:python写了一个kafka消费的脚本,脚本中消费kafka消息并将消费到的数据放在一个线程池中进行业务代码处理,使用supervisor管理这个脚本进程遇到问题:这个进程占用的内存会越来越大,知道将机器内存消耗完排查:网上找了一堆内存分析工具,好像都需要预埋代码,或者重新启动一个进程,全扯......
  • python基础35 网络编程 软件开发架构和七层协议
    软件开发架构网络编程我们要基于网络来编写一款B/S或者C/S架构的软件,比如:ATM,我们写的只是ATM的单机版本,没有接入网络系统,别人无法访问到的目的以ATM为例,现在我们想把之前写的ATM系统编程基于网络传输的,别人如果想用,就必须把客户端下载到本地电脑上,已登录为例,用户把用......
  • Python之Mixins机制
    Mixins机制classVehicle:#交通工具passclassFlyMinix:"""将主类中有多个子类要继承的方法单独拿出来,重新定义一个类,将这个有给有需要的子类继承,在主类中不再写这个方法"""deffly(self):"""跟飞行相关的功能......
  • python 文件操作
    文件介绍文本文件可以使用记事本软件打开txt,py,md,json二进制文件不能使用记事本软件打开音频文件mp3视频文件mp4....图片png,jpg,gif,exe文件操作打开文件open()rwa是⽂本⽅式打开,适⽤于⽂本⽂件,会对⼆进制进⾏编码转换rbwbab是⼆进制......
  • Navicat 查看数据库密码
    Navicat提供了导出连接的功能,当忘记数据库密码时,可以通过导出文件中的加密密码进行解密,查看数据库密码。导出链接,选择需要查看密码的数据库勾选导出密码,否则无法查看在导出文件中找到加密密码在线工具解密,https://tool.lu/coderunner,输入PHP代码,并将文件中的加密密......