0
点赞
收藏
分享

微信扫一扫

Python学习之十五_不同类型数据库表内容比较

yeamy 2023-12-26 阅读 50

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()



举报

相关推荐

0 条评论