zoukankan      html  css  js  c++  java
  • 使用SID连接Oracle数据库

    一、Python连接Oracle数据库

      1. 数据库配置文件config.py:

    oracle_config = {
        "host": "192.168.97.128",
        "port": "1521",
        "user": "abcd",
        "password": "abcd123",
        "sid": "masabc",
    }

      2. 连接数据库app.py:

    import json
    import logger
    import cx_Oracle as oracle
    import traceback
    from config import oracle_config
    import cx_Oracle
    
    
    class DatabaseAdapter:
        orahost = None
        oraport = 1521
        oraservicename = None
        orauser = None
        orapassword = None
        connectionstr = None
        conn = None
        cursor = None
        dsn = None
    
        def __init__(self):
            '''
            初始化,从配置文件读取服务器信息
            '''
            try:
                self.orahost = oracle_config['host']
                self.oraport = oracle_config['port']
                self.sid = oracle_config['sid']
                self.orauser = oracle_config['user']
                self.orapassword = oracle_config['password']
                self.dsn = cx_Oracle.makedsn(
                    self.orahost,
                    self.oraport,
                    sid=self.sid,
                )
            except:
                logger.writeLog("读取数据库配置文件失败!")
    
        def oraconnect(self):
            '''
            连接数据库方法
            '''
            try:
                self.conn = cx_Oracle.connect(
                    self.orauser,
                    self.orapassword,
                    self.dsn,
                    encoding='utf-8'
                )
                self.cursor = self.conn.cursor()
                return self.conn, self.cursor
            except:
                errstr = traceback.format_exc()
                logger.writeLog("Oracle数据库连接错误:" + errstr)
    
        def insert(self, sqlstr, para):
            '''
            数据库插入
            需要采用绑定变量的方式进行,否则会有安全问题
            '''
            # para = { dept_id=280, dept_name="Facility" }
            # cursor.execute("""
            # insert into departments (department_id, department_name)
            # values (:dept_id, :dept_name)""", data)
            try:
                if self.cursor:
                    self.cursor.execute(sqlstr, para)
                    self.conn.commit()
                else:
                    # 进行重连
                    logger.writeLog("Oracle数据库尝试重新连接", "insertfail.log")
                    self.oraconnect()
                    if self.cursor:
                        self.cursor.execute(sqlstr, para)
                        self.conn.commit()
                    else:
                        logger.writeLog("Oracle数据库重连插入失败:" + sqlstr + json.dumps(para), "insertfail.log")
            except:
                errstr = traceback.format_exc()
                logger.writeLog("Oracle数据库插入失败:" + errstr + sqlstr + json.dumps(para), "insertfail.log")
    
        def search(self, sqlstr, para=None):
            '''
            数据库查询
            '''
            try:
                if para == None:
                    self.cursor.execute(sqlstr)
                else:
                    self.cursor.execute(sqlstr, para)
                rows = self.cursor.fetchall()
                return rows
            except:
                logger.writeLog("Oracle数据库查询失败:" + sqlstr)
                return False
    
        def closeconn(self):
            '''
            关闭数据库连接
            '''
            try:
                self.cursor.close()
                self.conn.close()
            except:
                errstr = traceback.format_exc()
                logger.writeLog("Oracle数据库连接关闭错误:" + errstr)
    
    
    if __name__ == "__main__":
        db = DatabaseAdapter()
        ret = db.oraconnect()
        print(ret)
    
        # 测试验证
        jsonobj = {'ESN': 76511706, 'FuelVolumeTotal': 0.57263308763504, 'DEFVolumeTotal': 0.0235559437423944,
                   'OccurrenceTime': '2020-2-28 9:0:54'}
    
        sqlstr = """
                insert into user2.BASE_00059_3(ESN, FuelVolumeTotal, DEFVolumeTotal, OccurrenceTime)
                values (:ESN, :FuelVolumeTotal, :DEFVolumeTotal, to_date(:OccurrenceTime, 'YYYY-MM-DD HH24:MI:SS'))
                """
        parameters = {'ESN': jsonobj['ESN'],
                      'FuelVolumeTotal': jsonobj['FuelVolumeTotal'],
                      'DEFVolumeTotal': jsonobj['DEFVolumeTotal'],
                      'OccurrenceTime': jsonobj['OccurrenceTime']
                      }
    
        db.insert(sqlstr, parameters)

      3. 日志文件logger.py:

    import sys
    import logging
    from logging.handlers import TimedRotatingFileHandler
    import os
    
    def writeLog(message, filenames = "runtime.log"):
        logging.basicConfig(level=logging.WARNING,
                            format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                            filemode='a')
        formatter = logging.Formatter('%(asctime)s:%(filename)s:%(funcName)s:[line:%(lineno)d] %(levelname)s %(message)s')
        CURRENT_DIR = os.path.dirname(__file__)
        LOG_FILE = os.path.abspath(os.path.join(CURRENT_DIR, "logs", filenames))
        fileTimeHandler = TimedRotatingFileHandler(LOG_FILE, "D", 1, 0,encoding='utf-8')
        fileTimeHandler.suffix = "%Y%m%d.log"
        fileTimeHandler.setFormatter(formatter)
        loggers = logging.getLogger('')
        loggers.addHandler(fileTimeHandler)
        loggers.warn(message)
        loggers.handlers.pop()

    二、cx_Oracle连接报错处理

      1.错误信息

    2020-05-29 13:52:03,960 logger.py[line:18] WARNING Oracle数据库连接错误:Traceback (most recent call last):
      File "C:/Users/mabot/Desktop/DataIn/bfcecdw/DataInput/database.py", line 48, in oraconnect
        encoding='utf-8'
    cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "The specified module could not be found". See https://oracle.github.io/odpi/doc/installation.html#windows for help

      2.报错处理,参考网上教程(https://blog.csdn.net/qq_36227528/article/details/102758559)

      下载连接对应的oracle版本的客户端安装包,将安装包中dll文件复制到python安装路径中即可。

      

  • 相关阅读:
    pycharm快捷键、常用设置、包管理
    【转载】TCP socket心跳包示例程序
    【转载】C++定时器实现
    金龙一卡通登陆爬取数据 免验证码 多线程 学生卡 CAUC
    python3 正方教务系统 爬取数据
    29、Python之Web框架Django入门
    28、Python之前端组件学习
    27、Python之jQuery基础
    26、Python之JavaScript进阶篇
    25、Python之JavaScript基础
  • 原文地址:https://www.cnblogs.com/WiseAdministrator/p/12524588.html
Copyright © 2011-2022 走看看