实战经验分享,Python 连接 Oracle 踩坑实录

最近的一个测试任务需要测试 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建表语句:

  1. creat_table_sql="""CREATETABLE `testtable`(

  2. `id` bigintNOT NULL AUTO_INCREMENT,

  3. `name` varchar(255) NOT NULL COMMENT '字典名称',

  4. `remark` varchar(255) DEFAULTNULL COMMENT '描述',

  5. `testC01umn1` varchar(128) DEFAULTNULL,

  6. `testC01umn2` datetimeDEFAULTNULL,

  7. `testC01umn3` intDEFAULTNULL,

  8. `testC01umn4` varchar(128) DEFAULTNULL,

  9. `testC01umn5` varchar(128) DEFAULTNULL,

  10. `testC01umn6` varchar(128) DEFAULTNULL,

  11. `testC01umn7` varchar(128) DEFAULTNULL,

  12. `testC01umn8` varchar(128) DEFAULTNULL,

  13. `testC01umn9` intDEFAULTNULL,

  14. `testC01umn10` datetimeDEFAULTNULL,

  15. `testC01umn11` varchar(128) DEFAULTNULL,

  16. `testC01umn12` varchar(128) DEFAULTNULL,

  17. `testC01umn13` varchar(128) DEFAULTNULL,

  18. `testC01umn14` varchar(128) DEFAULTNULL,

  19. `testC01umn15` varchar(128) DEFAULTNULL,

  20. PRIMARYKEY (`id`)

  21. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=Utf8mb4_0900_ai_ci COMMENT='测试表'"""

Oracle建表语句:

  1. creat_table_sql="""CREATETABLE testtable (

  2. id NUMBER(38,0) NOT NULLPRIMARY KEY,

  3. nameVARCHAR2(255) NOT NULL,

  4. remark VARCHAR2(255) DEFAULTNULL,

  5. testColumn1 VARCHAR2(128) DEFAULTNULL,

  6. testColumn2 DATEDEFAULTNULL,

  7. testColumn3 NUMBER(10) DEFAULTNULL,

  8. testColumn4 VARCHAR2(128) DEFAULTNULL,

  9. testColumn5 VARCHAR2(128) DEFAULTNULL,

  10. testColumn6 VARCHAR2(128) DEFAULTNULL,

  11. testColumn7 VARCHAR2(128) DEFAULTNULL,

  12. testColumn8 VARCHAR2(128) DEFAULTNULL,

  13. testColumn9 NUMBER(10) DEFAULTNULL,

  14. testColumn10 DATEDEFAULTNULL,

  15. testColumn11 VARCHAR2(128) DEFAULTNULL,

  16. testColumn12 VARCHAR2(128) DEFAULTNULL,

  17. testColumn13 VARCHAR2(128) DEFAULTNULL,

  18. testColumn14 VARCHAR2(128) DEFAULTNULL,

  19. testColumn15 VARCHAR2(128) DEFAULTNULL

  20. """

建表语句的问题解决了,后面就要插入数据,问题更是一大堆。

最先出现的错误是: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)"""

在转换了日期格式后,顺利插入数据没有再报错。这次本来觉得很简单的测试数据注入费时费力,还好我把踩过的坑都帮同学们踩了一遍。

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值