最近由于项目原因,原本数据库由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执行,执行时间会变短,感觉十分神奇,于是我在同事的电脑上做了同样的实验,发现。。。。。竟然也出现这种情况
flask+oracle踩到的坑
最新推荐文章于 2025-08-03 02:36:50 发布