实战经验分享,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建表语句:

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

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

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/608832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全复习--简答整理

-----------------------------------------------------教材如上图------------------------------------------------------------ 1.对称加密和非对称加密各有什么特点?加密解密过程中有什么区别?优点P38【考】 对称加密的特点:在针对同一…

MVC设计模式和与三层架构的关系

MVC设计模式和与三层架构的关系 MVC是一种设计模式,将软件按照模型、视图、控制器来划分: M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为数据承载Bean&#x…

用C语言实现动态数组Vector

代码仓库地址 1. 动态数组原理 定义一个结构体类型,在结构体中用指针指向一个在堆空间开辟的一块内存。 2. 编写头文件 在头文件里定义Vector的数据结构和相关操作,可以通过修改 “typedef char* Element;” 来修改存储的数据的类型; #ifn…

歌手荆涛演唱的春节回家:传统与现代的交织,歌声里的乡愁与期盼

随着冬日渐寒,春节的脚步愈发临近。这是一个充满温馨与期待的时刻,一个穿越时空、凝聚亿万华夏儿女情感的盛大节日。春节,它不仅仅是一个传统习俗的展现,更是一种心灵的归宿,一种文化的传承。 在悠久的历史长河中&…

Selenium 学习(0.18)——软件测试之基本路径测试

1、基本路径法测试的概念 是一种白盒测试方法,它在程序控制流图的基础上,通过分析控制构造的环行复杂性,导出基本可执行路径集合,从而设计测试用例的方法。 要保证在测试中程序的每一个可执行语句至少执行一次 【这和语句…

很有用!小企业如何从零开始制作产品手册?

对于初创公司和小企业来说,创造一份高效、吸引人的产品手册可能不是特别简单,特别是当资源和预算有限的时候。然而,一份良好的产品手册可以帮助你传达你的品牌故事,展示你的产品,甚至可以帮助你提高销售额,…

Transformers 2023年度回顾 :从BERT到GPT4

人工智能已成为近年来最受关注的话题之一,由于神经网络的发展,曾经被认为纯粹是科幻小说中的服务现在正在成为现实。从对话代理到媒体内容生成,人工智能正在改变我们与技术互动的方式。特别是机器学习 (ML) 模型在自然语言处理 (NLP) 领域取得…

【仙丹秘法】如何炼制一颗稳定的仙丹

提示词始终保持不变 1:收集素材 制作lora_v1 2: 制作lora_v1 产生 1个人物 含 你想要的服装 导入 pose_1 到 control 1 生成人物 (white_background:1.1),front view,1boy,blue sleeveless t-shirt,blue shorts,detailed eyes,best quality,masterpiece,high res…

第三站:C/C++基础-二维数组

二维数组的概念 一维数组本身是多个大小相同的内存块,从0开始逐渐递增所组成的在横向上的有序"组合", 二维数组就是很多个一维数组在纵向上的组合,每一个一维数组就是二维数组在纵向上的从0开始的逐渐递增的一个单位,(所以一维数组在二维数组的基础上,每一个内存块…

Spring 基于注解的AOP见解4

5.基于注解的AOP配置 5.1创建工程 5.1.1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&…

SUDA-计算机网路-期末复习提纲

写在前面 帮苏大的同学整理的计网复习材料&#xff0c;用的是他们老师划定的范围。 1.负责互联网协议开发、标准制定、地址分配的国际组织名称及其主要职责 (1) 地址支持组织&#xff08;ASO&#xff09;负责IP地址系统的管理。 (2) 域名支持组织&#xff08;DNSO&#xff09;…

LeetCode(242)有效的字母异位词⭐

给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true示例 2: 输…

【2023 CSIG垂直领域大模型】大模型时代,如何完成IDP智能文档处理领域的OCR大一统?

目录 一、像素级OCR统一模型&#xff1a;UPOCR1.1、为什么提出UPOCR&#xff1f;1.2、UPOCR是什么?1.2.1、Unified Paradigm 统一范式1.2.2、Unified Architecture统一架构1.2.3、Unified Training Strategy 统一训练策略 1.3、UPOCR效果如何&#xff1f; 二、OCR大一统模型前…

kdump安装及调试策略

本文基于redhat系的操作系统&#xff0c;debian系不太一样&#xff0c;仅提供参考 1.kdump的部署 注&#xff1a;一般很多操作系统在安装时可默认启动kdump。 &#xff08;1&#xff09;需要的包 yum install kexec-tools crash kernel-debuginfo &#xff08;2&#xff0…

《堆排序》与《Top—k》

目录 ​编辑 前言&#xff1a; 关于《堆排序》&#xff1a; 第一步&#xff1a;建堆 第二步&#xff1a;排序 《Top—K问题》 关于Top—k问题&#xff1a; 前言&#xff1a; 我们在前面的blog中&#xff0c;对于《堆》已经有了初步的概念&#xff0c;那么接下来我们可以…

flex布局(2)

五、优缺点 优点&#xff1a; 简单易用&#xff1a;Flex布局使用简单&#xff0c;只需通过设置容器的属性即可实现弹性布局&#xff0c;无需复杂的计算和调整。自适应性&#xff1a;Flex布局可以根据容器的大小自动调整元素的位置和大小&#xff0c;适应不同的屏幕尺寸和设备…

3.5 RESOURCE ASSIGNMENT

一旦内核启动&#xff0c;CUDA运行时系统将生成相应的线程网格。正如上一节所讨论的&#xff0c;这些线程被分配给逐个块执行资源。在当前一代硬件中&#xff0c;执行资源被组织成流式多处理器&#xff08;SM&#xff09;。图3.12说明可以为每个SM分配多个线程块。每个设备都对…

uniapp中uview组件库中丰富的LineProgress 线形进度条 的使用方法

目录 平台差异说明 #基本使用 #设置进度条动画效果 #设置进度条内部显示百分比值 #修改进度条的样式 #API #Props #Slots 平台差异说明 AppH5微信小程序支付宝小程序百度小程序头条小程序QQ小程序√√√√√√√ #基本使用 通过percent设置当前的进度值&#xff0c;该…

计算机视觉下的数据增强代码实现

数据增强的实现 使用经典的pytorch框架下的torchvision.transformers对计算机视觉进行增强的代码实现。 使用下面的图像进行数据增强&#xff0c;相应的效果图如下所示&#xff01; 导包 import os import PIL.Image as Image from torchvision import transforms as transfor…

RT-Thread 线程间同步 信号量

线程间同步 在多线程实时系统中&#xff0c;一项工作的完成往往可以通过多个线程协调的方式共同来完成。 例如一项工作中的两个线程&#xff1a;一个线程从传感器中接收数据并且将数据写到共享内存中&#xff0c;同时另一个线程周期性地从共享内存中读取数据并发送出去显示&a…