Python使用cx_Oracle模块操作Oracle数据库详解


Posted in Python onMay 07, 2018

本文实例讲述了Python使用cx_Oracle模块操作Oracle数据库。分享给大家供大家参考,具体如下:

ORACLE_SID参数,这个参数是操作系统中用到的,它是描述我们要默认连接的数据库实例,对于一个机器上有多个实例的情况下,要修改后才能通过 conn / as sysdba连接,因为这里用到了默认的实例名。

简而言之,打个比方,你的名字叫小明,但是你有很多外号。你父母叫你小明,但是朋友都叫你的外号。

这里你的父母就是oracle实例,小明就是sid,service name就是你的外号。

sid用于实例区分各个数据库,service name用于外部链接。 它们可能是不同的,要注意你得到的是哪个名字,合理使用,否则远程连接别的数据库可能出错。

前言

Python自带的模块中有很多操纵文件的。我们可以把文件的数据读出来,经过处理还可以将数据写入文件中。但是对于数据的管理和分析来说,数据库还是专业一些。如果Python能和数据库结合在一起,那么就能结合两种的优势,提高效率。

工作中使用的是Oracle数据库,Python有一个模块cx_Oracle可以与Oracle相连。要使用cx_Oracle,就要先下载。

1. 下载cx_Oracle

Python一个官方网站PyPI,上面有丰富的模块。cx_Oracle就可以在PyPI中下载。打开PyPI的网址https://pypi.python.org/pypi,在里面搜索cx_Oracle,即可找到该模块,其下载地址为http://cx-oracle.sourceforge.net/。当然也可以通过其它的途径下载。

下载之后就可以使用了。

2. 使用流程

简单的使用流程如下:

①.引用模块cx_Oracle
②.连接数据库
③.获取cursor
④.使用cursor进行各种操作
⑤.关闭cursor
⑥.关闭连接

下面是一个简单的例子:

cx_Oracle.connect("用户名 /  密码@ Oracle服务器IP  /  Oracle的SERVICE_NAME")

获得 Oracle的SERVICE_NAME:

su - oracle #切换至oracle用户

env | grep ORACLE #查询ORACLE的环境变量

ORACLE_SID=benguo # benguo就是SERVICE_NAME

import cx_Oracle                     #引用模块cx_Oracle
conn=cx_Oracle.connect('load/123456@localhost/ora11g')  #连接数据库
c=conn.cursor()                      #获取cursor
x=c.execute('select sysdate from dual')          #使用cursor进行各种操作
x.fetchone()
c.close()                         #关闭cursor
conn.close()                       #关闭连接

例子:

#coding:utf-8
import cx_Oracle
def main():
  conn = cx_Oracle.connect("zebra/zebra@192.168.0.113/benguo")
  cur =conn.cursor()
  r= cur.execute("select * from userinfo")
  print
  print r.fetchone()
if __name__ == '__main__':
  main()

3. 几种用法

Python对数据库的操作主要有2方面:一个是写数据,一个是读数据。这2个方面的实现可以通过SQL语句实现,也可以通过存储过程实现。所以cx_Oracle的主要用法有:

①. 执行SQL语句

②. 调用存储过程和函数。

4. 执行SQL语句

执行SQL语句很简单,从上面的例子就可以看出。使用cursor.execute即可执行。使用fetchone或fetchall即可将执行结果读出来。

下面一个例子是Insert语句,使用的变量绑定。

import cx_Oracle
conn=cx_Oracle.connect('load/123456@loaclhost/ora11g')
c=conn.cursor()
x=c.execute('insert into demo(v) values(:1)',['nice'])
conn.commit();
c.close()
conn.close()

变量绑定和Oracle的动态SQL一样,都是冒号将占位符,即代码中的:1,对变量的复制就是传入一个List,即代码中的['nice']。有多少个变量,list中就应该对应多少个值,数目要一致,否则会报错。

执行之后,可以使用连接的一个方法connect.commit(),将事务提交。

5. 调用存储过程和方法

直接上代码:

--存储过程代码:
CREATE OR REPLACE PROCEDURE P_DEMO(V1 IN VARCHAR2, V2 OUT VARCHAR2) IS
BEGIN
  V2 := V1;
END;
#Python代码:
import cx_Oracle
conn=cx_Oracle.connect('load/123456@localhost/ora11g')
c=conn.cursor()
str1='nice'
str2='  '#需要有值,即len(str2)>=len(str1)
x=c.callproc('p_demo',[str1,str2])
print(str2)
c.close()
conn.close()

调用存储过程使用的是cursor.callproc方法。上面的存储过程中,一个变量的值是OUT型的,在Python中,对OUT型的变量赋值,主要该变量的长度不能小于存储过程中的。

--函数代码:
CREATE OR REPLACE function F_DEMO(V1 VARCHAR2) RETURN VARCHAR2 IS
BEGIN
  RETURN V1;
END;
#Python代码:
import cx_Oracle
conn=cx_Oracle.connect('load/123456@localhost/ora11g')
c=conn.cursor()
str1='nice'
str2=c.callfunc('f_demo',cx_Oracle.STRING,[str1])
print(str2)
c.close()
conn.close()

调用函数使用的方法是cursor.callfunc。这个与调用存储过程不同之处在于,它需要指定传输参数的类型。

结束

通过cx_Oracle,可以是Python与Oracle数据库相互沟通,这样两者就可以长处互补。

比如,可以将Python当成一个数据收集的工具,可以从Web,从文件中获取数据,然后将这些数据保存到Oracle数据库中,在Oracle数据库上进行数据的进一步分析。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python实现的系统实用log类实例
Jun 30 Python
python3.4下django集成使用xadmin后台的方法
Aug 15 Python
python使用pil库实现图片合成实例代码
Jan 20 Python
python实现word 2007文档转换为pdf文件
Mar 15 Python
不管你的Python报什么错,用这个模块就能正常运行
Sep 14 Python
pandas的排序和排名的具体使用
Jul 31 Python
linux环境下安装python虚拟环境及注意事项
Jan 07 Python
pytorch如何冻结某层参数的实现
Jan 10 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
Feb 28 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
Jul 02 Python
史上最详细的Python打包成exe文件教程
Jan 17 Python
图文详解matlab原始处理图像几何变换
Jul 09 Python
Python代码缩进和测试模块示例详解
May 07 #Python
Python采集代理ip并判断是否可用和定时更新的方法
May 07 #Python
利用python的socket发送http(s)请求方法示例
May 07 #Python
Python爬虫抓取代理IP并检验可用性的实例
May 07 #Python
Python视频爬虫实现下载头条视频功能示例
May 07 #Python
十分钟利用Python制作属于你自己的个性logo
May 07 #Python
Redis使用watch完成秒杀抢购功能的代码
May 07 #Python
You might like
详解在PHP的Yii框架中使用行为Behaviors的方法
2016/03/18 PHP
php实现统计二进制中1的个数算法示例
2018/01/23 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
struts2+jquery组合验证注册用户是否存在
2014/04/30 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
网页中表单按回车就自动提交的问题的解决方案
2014/11/03 Javascript
详解AngularJS中的作用域
2015/06/17 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
2016/12/27 Javascript
nodejs使用async模块同步执行的方法
2019/03/02 NodeJs
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
vue框架制作购物车小球动画效果实例代码
2019/09/26 Javascript
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
JavaScript实现模态对话框实例
2020/01/13 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
JavaScript实现网页跨年倒计时
2020/12/02 Javascript
使用python装饰器验证配置文件示例
2014/02/24 Python
菜鸟使用python实现正则检测密码合法性
2016/01/05 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
通过字符串导入 Python 模块的方法详解
2019/10/27 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
python 解决selenium 中的 .clear()方法失效问题
2020/09/01 Python
AP澳洲中文网:澳洲正品直邮,包税收件无忧
2019/07/12 全球购物
解释DataSet(ds) 和 ds as DataSet 的含义
2014/07/27 面试题
信息专业大学生自我评价分享
2014/01/17 职场文书
开门红主持词
2014/04/02 职场文书
教师四风对照检查材料思想汇报
2014/09/17 职场文书
2014领导班子四风问题对照检查材料思想汇报
2014/09/21 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
小学班主任心得体会
2016/01/07 职场文书
JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)
2021/05/26 Servers
PyTorch中permute的使用方法
2022/04/26 Python