需要安装的包
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)