python操作Oracle数据库

云中志

共 3822字,需浏览 8分钟

 · 2021-11-14

我们有一个系统因为每个月要提供统计数据表格,为了方便统计我用python写了一个统计脚本,运行脚本就可以生成统计表格,特别方便。 最近离职在交接工作,要帮同事配置相关环境,所以我就把去年的这篇文章又翻了出来,我记得之前公众号上发过,但是我搜了下,没找到,可能记错了,但是素材库确实有,好吧,权当记错了,我重新发一下,各位小伙伴也可以参考下。 懂点python工作效率真的可以提高很多,如果这些数据每次都手动统计的话,至少十分钟,但是如果用脚本的话30s搞定,效率贼高,省下这宝贵的九分三十秒我又可以愉快地写bug了,以下是之前发送内容的全文:

python操作Oracle数据库


利用这漫长的假期,我又一次拾起来已经放弃了很多次的python,开始了一波新的尝试,不过庆幸的是,这一次好像多少有了一点眉目,感觉开始入门了(我承认,我一开始对python有成见),所以我就开始了新的尝试,也有了新的收获,也有了今天这两篇博客。

安装cx_Oracle

cx_Oracle相当于python的Oracle数据库的驱动,必须有驱动才能连接Oracle数据库,具体方法如下:

方法一:直接在官方网站下载,然后安装

https://pypi.org/project/cx-Oracle/

选择对应的系统及版本,然后下载安装

方法二:通过pip安装

pip install cx-Oracle

我是同第二种方式安装,可以通过如下方式检查自己是否已经安装,以及安装的版本信息:

 pip show -f cx-Oracle

添加Oracle客户端配置

下载Oracle数据库对应的客户端

查看数据库版本

可以通过如下sql查看版本信息:

select * from v$version;

比如我的Oracle数据库版本号为:

1 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
2 PL/SQL Release 11.2.0.4.0 - Production
"CORE 11.2.0.4.0 Production"
4 TNS for Linux: Version 11.2.0.4.0 - Production
5 NLSRTL Version 11.2.0.4.0 - Production
下载数据库客户端

具体下载地址如下:

https://www.oracle.com/cn/database/technologies/instant-client/downloads.html

选择对应的操作系统和版本,当然必须得和你的python版本一致(64Bit/32Bit)

因为我的数据库版本是:11.2.0.4.0,所以我下载的客户端版本也是这个版本instantclient-basic-windows.x64-11.2.0.4.0.zip

然后解压,并将解压后的地址信息加入到操作系统环境变量中,比如我的文件夹路径为:

E:\app\myUserName\product\11.2.0_64bit

那么,我的环境变量设置如下:

上面的环境变量是添加在path这个变量底下的。

配置TNS

创建tnsnames.ora

进入如下目录,并创建tnsnames.ora文件。如果没有可以手动创建(我是之前安装过完整版客户端,所以已经有了,我从已经安装过的目录下直接拷贝,之前安装的是32Bit)

E:\app\myUserName\product\11.2.0_64bit\network\admin

也有人说可以在上面添加的环境变量的目录下直接创建这个文件(即E:\app\myUserName\product\11.2.0_64bit),我没有尝试过,如果有小伙伴试过了可行,请告诉我,谢谢!

配置数据库信息

打开刚刚创建的tnsnames.ora文件,加入你的数据库连接配置(TNS配置):

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = host)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
      (INSTANCE_NAME = orcl1)      
    )
  )

你如果有用ql/sql的话,对这个文件应该不陌生,host就是你的数据库ip地址,PORT就是数据库端口,SERVER一般应该都一样(我猜的),SERVICE_NAMEINSTANCE_NAME应该是你创建数据库的时候设置的,没创建过Oracle数据库,我只负责用😂。

添加完以上配置信息,然后就该开始编写我们的测试脚本了

编写python脚本

脚本很简单,就几行代码:

#!/usr/bin/env python
import cx_Oracle
# 格式:用户名/密码@主机:端口/SERVICE_NAME
con = cx_Oracle.connect('userName/Password@host:1522/orcl'
# 格式:用户名,密码,主机:端口/SERVICE_NAME
con2 = cx_Oracle.connect('userName''Password''host:1522/orcl'
print(con.version)
print(con2.version)

这里解释下,其实也不用解释,因为确实很简单。引入cx_Oracle,然后获取数据库连接,打印数据库版本。获取数据库有两种方式,区别不大,都是将用户名、密码、主机、端口、服务传入,然后获取数据库连接。

遇到的问题

如果你能正常打印数据库版本信息,那么恭喜你,第一次就如此完美的取得成功。很多人,包括我,在进行以上步骤都遇到了很多问题,说下我的问题,报错信息如下:

cx_Oracle.DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded:  "libclntsh.so: cannot open shared object file: No such file or directory". See https://oracle.github.io/odpi/doc/installation.html#linux for help

和以上错误很类似,因为没保留错误信息,所以我大概根据浏览器历史记录查了下。我查询的结果是说python版本和Oracle数据库客户端版本不一致,因为我的python是64位的,数据库客户端版本是32位,然后我下载64位客户端,并替换了环境变量,重启了电脑,依然不行,几经折腾,最后我发现有篇博客说是需要在python安装根目录下复制Oracle配置的dll文件,想尝试的时候,发现文件夹没权限,最后忍无可忍,我把python重新安装(3.8),然后安装pip并重新安装cx-Oracle(cx_Oracle-7.3.0,pip直接安装),竟然神奇的好了,嗯~ o( ̄▽ ̄)o还好我没放弃😂

完善脚本,执行查询

完成以上步骤,说明我们已经完成了python连接Oracle数据库的配置工作,接下来我们将了解如何执行sql语句,并获取返回结果。其实,也很简单,参照如下代码即可。

 # 获取数据库游标对象
    cursor= connection.cursor()
    # sql参数集
    params = {'aapid': aapid,'yearMonth':'2020-02'}
    # sql
    sql = '''SELECT * FROM log WHERE CreateTime like :yearMonth||'%'
    AND aapid=:aapid '''

    # 执行sql
    query = cursor.execute(sql, params)
 # 获取查询结果集
    rows = cursor.fetchall()  
 # 获取结果列(数据库字段名)
    titles = cursor.description 
    print(rows)
    print(titles)

执行以上代码,即可打印sql查询到的结果集。需要注意的是,sql查询参数集是通过字典的形式导入的,然后在sql中通过: + 键名的方式传入参数。

当然能执行sql的方法不止上面的一种,比如你需要入参的时候,可以通过如下方式执行查询:

sql = "select * from test limit 10"  # 在test表中取出十条数据
search_count = cursor.execute(sql)

有关其他的插入、更新、删除、建表等操作,后续再继续进行深入探索,主要是我现在也不会啊😂好了,今天就到这里吧,不早了,早点休息吧,晚安,好梦!

- END -

浏览 23
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报