最近的一个测试任务需要测试 oracle 同步 hive 数据库的性能,那就需要对 oracle 数据库灌注测试数据。我就又打开了我的IDE,准备把我之前一下可以灌50w数据到 MySQL 的代码,改一改,直接用。
因为我在网上看到,语法上也差不多,基本上没有区别。于是,我先打开了 windows 的 cmd 模式,输入:pip install cx_Oracle 下载好连接数据库的第三方包。当然也可以通过 python 第三方库官网(https://pypi.org/)下载相应版本的文件后自行安装。
搞定第三方库,后面就开始写代码了,我直接把之前连接 MySQL 的代码拿过来做修改。首先来看数据库连接部分。
连接方式不同,但是也不难,连接后就试试吧,先查看一下版本号,结果就出错了
报错信息:
oracle_db = cx_Oracle.connect('dspuser','Aa123456','10.26.214.119:1521/orcl')
cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "The specified module could not be found". See https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html for help
上网查吧,发现是因为 python 的安装目录下,没有 oracle 的 dll 文件,也许是因为第三方包需要,那就安排。
我从网上找到的帖子中提供了 oracle11 的 dll 文件,下载回来放到 python 安装目录后迫不及待的再次运行代码,结果 DPI-1047 的错误倒是没有了,换成 “ORA-28040: No matching authentication protocol” 了。
只好再次上网查询出错原因,原来是 oracle 的版本不一致,我用的是 oracle11 的 dll,而我连接的 oracle 版本是在我使用 select * from v$version 语句查询后,才看到我连接的 oracle 版本。
问题跟着又来了,我去哪找12.2版本的dll文件呢?还是继续网上找,多篇文章都说要下载一个instantclient。那就把它请出来吧。
我通过oracle官网找到并下载了instantclient,地址如下:https://www.oracle.com/cn/database/technologies/instant-client/winx64-64-downloads.html
而下载下来的 instantclient 其实就是一个zip包,打开这个包,把里面所有的dll都一股脑的复制到 python 的根目录下,链接的问题终于解决了!
下面就开始创建表了,我是直接把 MySQL 创建表的语句直接拿了过来,结果就不出意外的出了意外。
报错信息:
ORA-00907: missing right parenthesis,报错位置在创建表语句。因为是用 MySQL的建表语句,所以只好找 oracle 相关建表语句,发现和 MySQL 语句还是有区别的。首先,表名和字段名上的小引号要去掉;其次,字段类型不同,得改(oracle与MySQL对应请网上自查);最后,oracle不支持自增,主键在字段定义中声明。
MySQL建表语句:
-
creat_table_sql="""CREATETABLE `testtable`(
-
`id` bigintNOT NULL AUTO_INCREMENT,
-
`name` varchar(255) NOT NULL COMMENT '字典名称',
-
`remark` varchar(255) DEFAULTNULL COMMENT '描述',
-
`testC01umn1` varchar(128) DEFAULTNULL,
-
`testC01umn2` datetimeDEFAULTNULL,
-
`testC01umn3` intDEFAULTNULL,
-
`testC01umn4` varchar(128) DEFAULTNULL,
-
`testC01umn5` varchar(128) DEFAULTNULL,
-
`testC01umn6` varchar(128) DEFAULTNULL,
-
`testC01umn7` varchar(128) DEFAULTNULL,
-
`testC01umn8` varchar(128) DEFAULTNULL,
-
`testC01umn9` intDEFAULTNULL,
-
`testC01umn10` datetimeDEFAULTNULL,
-
`testC01umn11` varchar(128) DEFAULTNULL,
-
`testC01umn12` varchar(128) DEFAULTNULL,
-
`testC01umn13` varchar(128) DEFAULTNULL,
-
`testC01umn14` varchar(128) DEFAULTNULL,
-
`testC01umn15` varchar(128) DEFAULTNULL,
-
PRIMARYKEY (`id`)
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=Utf8mb4_0900_ai_ci COMMENT='测试表'"""
Oracle建表语句:
-
creat_table_sql="""CREATETABLE testtable (
-
id NUMBER(38,0) NOT NULLPRIMARY KEY,
-
nameVARCHAR2(255) NOT NULL,
-
remark VARCHAR2(255) DEFAULTNULL,
-
testColumn1 VARCHAR2(128) DEFAULTNULL,
-
testColumn2 DATEDEFAULTNULL,
-
testColumn3 NUMBER(10) DEFAULTNULL,
-
testColumn4 VARCHAR2(128) DEFAULTNULL,
-
testColumn5 VARCHAR2(128) DEFAULTNULL,
-
testColumn6 VARCHAR2(128) DEFAULTNULL,
-
testColumn7 VARCHAR2(128) DEFAULTNULL,
-
testColumn8 VARCHAR2(128) DEFAULTNULL,
-
testColumn9 NUMBER(10) DEFAULTNULL,
-
testColumn10 DATEDEFAULTNULL,
-
testColumn11 VARCHAR2(128) DEFAULTNULL,
-
testColumn12 VARCHAR2(128) DEFAULTNULL,
-
testColumn13 VARCHAR2(128) DEFAULTNULL,
-
testColumn14 VARCHAR2(128) DEFAULTNULL,
-
testColumn15 VARCHAR2(128) DEFAULTNULL
-
"""
建表语句的问题解决了,后面就要插入数据,问题更是一大堆。
最先出现的错误是:ORA-00928: missing SELECT keyword,这个错误主要是因为插入的数据字段名含有关键字,我试了好几种办法都无法避免(主要是懒的再从新建表或修改字段名)
最后插入数据的语句干脆就不填写字段名,只要位置正确就可以了,还有就是插入的数据不能使用python的格式化符号‘%s’来替换,只能使用占位符。所以这时的插入语句就变成了这样:
insert_sql="""INSERT INTO TESTTABLE VALUES(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12, 13 ,:14,:15)"""
我把字段名都不要了,这回总没错了吧,结果还是报错!
报错信息:ORA-01861: literal does not match format string。再一次全网搜索,发现是因为我有日期格式的字段,在插入数据时需要转换一下才可以,所以最终我的插入语句变成了这样:
insert_sql="""INSERT INTO TESTTABLE VALUES(:1,:2,:3,:4,to_data(:5,'yyyy-MM-DD hh24:mi:ss'),:6,:7,:8,:9,:10,:11,:12,to_data(:13,'yyyy-MM-DD hh24:mi:ss'),:14,:15)"""
在转换了日期格式后,顺利插入数据没有再报错。这次本来觉得很简单的测试数据注入费时费力,还好我把踩过的坑都帮同学们踩了一遍。
总结:
感谢每一个认真阅读我文章的人!!!
作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。