暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python学习之六_同时访问Oracle和Mysql的方法

济南小老虎 2023-07-19
62

背景

jaydebeapi 可以访问大部分数据库. 
但是他有一个问题是仅能够访问一种类型的数据库.
如果同事连接两种数据库,那么就会出现问题
会有如下的提示:
TypeError: Class com.mysql.cj.jdbc.Driver is not found
网上有方法是修改 jaydebeapi的源码进行完善
我这边想了下感觉有一定的风险. 毕竟升级和连续处理比较麻烦.
基于此,我想以Oracle为基准时, 使用cx-Oracle的方式连接Oracle
其他的数据库使用 jaydebeapi的方式进行处理.
这样的话可以规避这个问题. 当然规避的不是非常彻底. 一次只能是一对一,不能一对多.


cx-Oracle的安装

注意cx-Oracle 需要先安装module
最好也安装一下 oracle的instant的安装介质.
需要的其他module也比较多
比如 sys, configparser,os等.


配置文件说明

[cx]
ip=10.110.xxx.xxx
port=1521
uname=something
pwd=somepassword
tnsname=ora19c


代码处理 第一部分

import cx_Oracle
import configparser
import os
os.environ['path'] = r'D:\work\instantclient_12_2'

# 引入必须要的包, 以及os.environ环境变量设置
# 将oracle的instantclient添加进来.


代码处理 第二部分

    config = configparser.ConfigParser()
config.read('cx.ini', encoding='utf-8')

ip = config.get('cx', 'ip')
port = config.get('cx', 'port')
uname = config.get('cx', 'uname')
pwd = config.get('cx', 'pwd')
tnsname = config.get('cx', 'tnsname')

dsnStr = cx_Oracle.makedsn(ip, port, service_name=tnsname)
connect_str = "oracle://%s:%s@%s" % (uname, pwd, dsnStr)

conn = cx_Oracle.connect(uname, pwd, dsn=dsnStr)
cur = conn.cursor()
cur.execute(sql)
data = cur.fetchall()
cur.close()
conn.close()


jaydebeapi访问Mysql的方法-配置文件

[mysql]
jdbcString=com.mysql.cj.jdbc.Driver
driverPath=./driver/mysql-connector-java-8.0.23.jar
urlString=jdbc:mysql://10.110.xxx.xxx:3306/xxxx
userName=xxxx
passWord=xxxxxxx?!

# 需要注意 Mysql5和Mysql8的驱动类型是不一样的
Mysql5.x: com.mysql.jdbc.Driver
Mysql8.x:com.mysql.cj.jdbc.Driver

连接代码

config.read('db.ini',encoding='utf-8')
def getconn(dbinfo) :

jdbcString = config.get(dbinfo,'jdbcString')
driverPath = config.get(dbinfo,'driverPath')
urlString = config.get(dbinfo,'urlString')
userName = config.get(dbinfo,'userName')
passWord = config.get(dbinfo,'passWord')
conn = jaydebeapi.connect(jdbcString,urlString,[userName,passWord],driverPath)
return conn
引用的代码为:

import dbconnection

def getdata(sql):
connMysql = dbconnection.getconn('mysql')
curMysql = connMysql.cursor()
curMysql.execute(sql)
data = curMysql.fetchall()
curMysql.close()
return data


其他说明

这种方式下就可以同事打开两种数据库进行查询和比较了.
各种方式其实都有, 感谢原作者提供的各种资料
翻阅了很多blog, 不再一一罗列了.


文章转载自济南小老虎,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论