flask+oracle踩到的坑

本文分享了从MySQL迁移到Oracle数据库的实际经验,包括使用cx_oracle替代pymysql进行连接,解决Navicat执行SQL速度差异问题,以及通过游标优化SQL执行效率的心得。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近由于项目原因,原本数据库由mysql需要迁移到oracle上,因为是第一次使用,遇到很多诡异的坑点
1.首先是连接数据库工具,由pymysql换成了cx_oracle上,同是64位oracle的instantclient和python,切记将instantclient添加到系统的环境变量里及重启pycharm后,方可连接成功
2.其次是navicat连接oracle,需要将instantclient中的oci.dll文件添加到navicat选项\环境中
3.使用navicat后,遇到的坑点就来了,由于之前一直使用的是mysql,navicat中执行sql语句速度很快,就想当然的认为navicat工具里下方显示的执行时间就是程序里执行原生sql的时间,结果换了oracle发现,一段很长的sql在程序里执行只需要零点零几秒,在navicat中长达几十秒。navicat中执行sql的时间并不能代表重新里执行sql快慢的参考,刚开始写完代码优化时,没考虑到这个原因,接口执行非常慢,还以为是数据量太大,后来发现后,问题找偏了。
4.接着上面,项目里执行原生sql使用的是db.engine.execute(),与db.session.execute()同理,查询出结果是sqlalchemy对象,python不能直接操作,需要将它转化为python可用的数据结构,之前的做法是使用list或dict强制转换,打印执行时间后发现耗时太长,不到一万的数据量,跑了十几秒,于是猜测是连接数据库工具cx_oracle的问题,可是网上的资料只找到这一种,心想直接使用游标会不会不一样,结果,同样的程序相比原来耗时快到飞起,可是最大的坑点也来了。
5.在使用cx_oracle游标执行原来的sql后,同样的数据量耗时缩短了好几倍,查询得到的结果是元组套元组的格式,本以为这个问题到此为止了,可是当我回退代码到之前版本,也就是仍就使用db.engine.execute()执行sql后,发现速度也变快了,而代码相比之前都没有改动过,这就得出了一个结论,原本使用sqlalchemy执行的sql在经过游标执行后,再使用sqlalchemy执行,执行时间会变短,感觉十分神奇,于是我在同事的电脑上做了同样的实验,发现。。。。。竟然也出现这种情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值