python操作Oracle数据库
安装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数据库版本号为:
1Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
2PL/SQL Release 11.2.0.4.0 - Production
3"CORE11.2.0.4.0Production"
4TNS for Linux: Version 11.2.0.4.0 - Production
5NLSRTL Version 11.2.0.4.0 - Production
下载数据库客户端
具体下载地址如下:
https://www.oracle.com/cn/database/technologies/instant-client/downloads.html
选择对应的操作系统和版本,当然必须得和你的python版本一致(64Bit/32Bit)
然后解压,并将解压后的地址信息加入到操作系统环境变量中,比如我的文件夹路径为:
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_NAME和INSTANCE_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)
有关其他的插入、更新、删除、建表等操作,后续再继续进行深入探索,主要是我现在也不会啊😂好了,今天就到这里吧,不早了,早点休息吧,晚安,好梦!