Python学习只十五_不同类型数据库表内容比较
前言
最近学习力总结了很多Python相关的内容
本次想继续学习一下不同数据库之间的数据比较.
这样理论上可以极大的缩减不同数据库测试成本.
感谢Python 以及之前大拿的各种资料.
这个学习还是表简单与单纯.
理论上可以通过标准SQL将输入进行一些转换.
将不通数据库类型进行一定程度的同类型处理.
比较会更加有效果
本次demo 仅是验证了varchar类型的比较.
其他说明
本次考虑的范围是 不同类型数据库下
相同表结构的表的数据对比.
本次范例是: Oracle数据库与信创神通数据库的对比
其他数据库类似.
需要注意不建议使用完全一样的连接工具.
比如Oracle我选用了cx-Oracle
神通我选用了 jaydebeapi
如果完全相同, 可能会有一些异常.
需要严格一直的查询SQL.
这样便于数据出结果.
理论上可以选用不通的数据库查询SQL
可以通过SQL后缀的方式进行处理.
后续可以增加异常判断, 事务处理等.
其他需要的资料
Oracle的instant client
oscar的驱动
配置文件主要如下:
数据库表查询的SQL:
建议有排序, 有具体列, 避免因为列顺序不一致,排序不一致影响结果
数据库连接字符串:
不同数据库的连接字符串不一样.
通过configparser的方式进行构造和读取.
Python源码
import cx_Oracle
import configparser
from sqlalchemy import create_engine
import jaydebeapi
import os
os.environ['path'] = r'D:\work\instantclient_12_2'
config = configparser.ConfigParser()
config.read('oscar.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)
engine = create_engine(connect_str)
connoracle = cx_Oracle.connect(uname, pwd, dsn=dsnStr)
jdbcString = config.get('OSCAR', 'jdbcString')
driverPath = config.get('OSCAR', 'driverPath')
urlString = config.get('OSCAR', 'urlString')
userName = config.get('OSCAR', 'userName')
passWord = config.get('OSCAR', 'passWord')
connoscar = jaydebeapi.connect(jdbcString, urlString, [userName, passWord], driverPath)
comparesql = configparser.ConfigParser()
comparesql.read('comparesql.ini',encoding='utf-8')
alloptions = comparesql.options('SQL')
print("本次要对比的所有数据库表如下: ")
print(alloptions)
for i in alloptions :
getsql = comparesql.get('SQL', i)
curoracle = connoracle.cursor()
curoracle.execute(getsql)
oracleresult = curoracle.fetchall()
curoscar = connoscar.cursor()
curoscar.execute(getsql)
oscarresult = curoscar.fetchall()
if oracleresult == oscarresult :
print("Oracle和OSCAR的 " + f"{i:20}" + " 是相同的" )
else :
print("Oracle和OSCAR的 " + f"{i:20}" + " 是不同的")
curoscar.close()
curoracle.close()