完整cx_Oracle连接数据库代码

需要安装的包

pip install --index-url https://pypi.douban.com/simple cx-Oracle
pip install --index-url https://pypi.douban.com/simple pycryptodome
pip install --index-url https://pypi.douban.com/simple SQLAlchemy

需要准备的软件:

instantclient  下载地址(按需下载):Instant Client for Linux x86-64 (64-bit)

DBConfig.py

from common.DESUtil import EncryptDate
import cx_Oracle
from sqlalchemy import create_engine

ENV = "TEST"
if ENV == "TEST":
    XX_DB = {
        "ip":"172.0.0.1",
        "port":"1521",
        "service":"kfdb2",
        "dbuser":"SIT",
        "dbpass":"xxxx==",
    }
    db_dict = {
        "test1": XX_DB,
    }
    oracle_lib_dir=r"D:\XjmAppPackage\instantclient-basic-windows.x64-11.2.0.4.0\instantclient_11_2"
else:
    oracle_lib_dir = r"D:\instantclient_11_2"
    XX_DB = {
        "ip":"172.0.0.1",
        "port":"1521",
        "service":"kfdb2",
        "dbuser":"SIT",
        "dbpass":"xxxx==",
    }
    db_dict = {
        "test1": XX_DB,
    }

def getEngine(db):
    if not db in db_dict.keys():
        return None
    else:
        if ENV == "TEST":
            try :
                cx_Oracle.init_oracle_client(lib_dir=oracle_lib_dir)
            except cx_Oracle.ProgrammingError as e:
                print(e)
        db_info = db_dict[db]
        dsnstr = cx_Oracle.makedsn(db_info["ip"], db_info["port"], service_name=db_info["service"])
        eg = EncryptDate("7hn@#DNsk9f%*&()")
        connect_str = "oracle://%s:%s@%s" % (db_info["dbuser"], eg.decrypt(db_info["dbpass"]), dsnstr)
        return create_engine(connect_str,encoding='utf-8', echo=True)

DESUtil.py

from Crypto.Cipher import DES3
import base64

class EncryptDate:
    def __init__(self, key):
        self.key = key  # 初始化密钥
        self.iv = b'01234567' # 偏移量
        self.length = DES3.block_size  # 初始化数据块大小
        self.des3 = DES3.new(self.key, DES3.MODE_CBC, self.iv)  # 初始化AES,CBC模式的实例
        # 截断函数,去除填充的字符
        self.unpad = lambda date: date[0:-ord(date[-1])]

    def pad(self, text):
        """
        #填充函数,使被加密数据的字节码长度是block_size的整数倍
        """
        count = len(text.encode('utf-8'))
        add = self.length - (count % self.length)
        entext = text + (chr(add) * add)
        return entext

    def encrypt(self, encrData):  # 加密函数

        res = self.des3.encrypt(self.pad(encrData).encode("utf8"))
        msg = str(base64.b64encode(res), encoding="utf8")
        # msg =  res.hex()
        return msg

    def decrypt(self, decrData):  # 解密函数
        res = base64.decodebytes(decrData.encode("utf8"))
        # res = bytes.fromhex(decrData)
        msg = self.des3.decrypt(res).decode("utf8")
        return self.unpad(msg)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值