python操作oracle的完整教程分享


Posted in Python onJanuary 30, 2018

1. 连接对象

操作数据库之前,首先要建立数据库连接。

有下面几个方法进行连接。

>>>import cx_Oracle
>>>db = cx_Oracle.connect('hr', 'hrpwd', 'localhost:1521/XE')
>>>db1 = cx_Oracle.connect('hr/hrpwd@localhost:1521/XE')
>>>dsn_tns = cx_Oracle.makedsn('localhost', 1521, 'XE')
>>>print dsn_tns
 
>>>print db.version
10.2.0.1.0
>>> versioning = db.version.split('.')
>>> print versioning
['10', '2', '0', '1', '0']
>>> if versioning[0]=='10':
... print "Running 10g"
... elif versioning[0]=='9':
... print "Running 9i"
...
Running 10g
>>> print db.dsn
localhost:1521/XE

2. cursor对象

使用数据库连接对象的cursor()方法,你可以定义任意数量的cursor对象,简单的程序可能使用一个cursor,并重复使用了,但大型项目会使用多个不同的cursor。

>>>cursor= db.cursor()

应用程序逻辑通常需要清楚的区分处理数据操作的每个阶段。这将帮助更好的理解性能瓶颈和代码优化。

这些步骤有:

parse(optional)

无需调用该方法,因为执行阶段会自动先执行,用于检查sql语句是否正确,当有错误时,抛出DatabaseError异常及相应的错误信息。如:‘'ORA-00900:invalid SQL statement.“。

Execute
cx_Oracle.Cursor.execute(
statement,[parameters], **keyword_parameters)

该方法能接收单个参数SQL,直接操作数据库,也可以通过绑定变量执行动态SQL,parames或keyworparameters可以是字典、序列或一组关键字参数。

cx_Oracle.Cursor.executemany(statement,parameters)

特别有用的批量插入,避免一次只能插入一条;

Fetch(optional)

仅用于查询,因为DDL和DCL语句没有返回结果。如果cursor没有执行查询,会抛出InterfaceError异常。

cx_Oracle.Cursor.fetchall()

获取所有结果集,返回元祖列表,如果没有有效行,返回空列表。

cx_Oracle.Cursor.fetchmany([rows_no])

从数据库中取下一个rows_no数据

cx_Oracle.Cursor.fetchone()

从数据库中取单个元祖,如果没有有效数据返回none。

3. 绑定变量

绑定变量查询可以提高效率,避免不必要的编译;参数可以是名称参数或位置参数,尽量使用名称绑定。

>>>named_params = {'dept_id':50, 'sal':1000}
>>>query1 = cursor.execute('SELECT * FROM employees WHERE department_id=:dept_idAND salary>:sal', named_params)
>>> query2 = cursor.execute('SELECT * FROM employees WHERE department_id=:dept_idAND salary>:sal', dept_id=50, sal=1000)
Whenusing named bind variables you can check the currently assigned ones using thebindnames() method of the cursor:
 
>>> printcursor.bindnames() 
['DEPT_ID', 'SAL']

4. 批量插入

大量插入插入操作,可以使用python的批量插入功能,无需多次单独调用insert,这样可以提升性能。参考后面示例代码。

5. 示例代码

'''
Created on 2016年7月7日
@author: Tommy
'''
import cx_Oracle

class Oracle(object):
 """ oracle db operator """
 def __init__(self,userName,password,host,instance):
 self._conn = cx_Oracle.connect("%s/%s@%s/%s" % (userName,password,host,instance))
 self.cursor = self._conn.cursor()
 
 def queryTitle(self,sql,nameParams={}):
 if len(nameParams) > 0 :
  self.cursor.execute(sql,nameParams)
 else:
  self.cursor.execute(sql)

 colNames = []
 for i in range(0,len(self.cursor.description)):
  colNames.append(self.cursor.description[i][0])
 
 return colNames
 
 # query methods
 def queryAll(self,sql):
 self.cursor.execute(sql)
 return self.cursor.fetchall()
 
 def queryOne(self,sql):
 self.cursor.execute(sql)
 return self.cursor.fetchone()
 
 def queryBy(self,sql,nameParams={}):
 if len(nameParams) > 0 :
  self.cursor.execute(sql,nameParams)
 else:
  self.cursor.execute(sql)
  
 return self.cursor.fetchall()
 
 def insertBatch(self,sql,nameParams=[]):
 """batch insert much rows one time,use location parameter"""
 self.cursor.prepare(sql)
 self.cursor.executemany(None, nameParams)
 self.commit()
 
 def commit(self):
 self._conn.commit()
 
 def __del__(self):
 if hasattr(self,'cursor'): 
  self.cursor.close()
  
 if hasattr(self,'_conn'): 
  self._conn.close()

def test1():
 # sql = """select user_name,user_real_name,to_char(create_date,'yyyy-mm-dd') create_date from sys_user where id = '10000' """
 sql = """select user_name,user_real_name,to_char(create_date,'yyyy-mm-dd') create_date from sys_user where id =: id """
 oraDb = Oracle('test','java','192.168.0.192','orcl')
 
 fields = oraDb.queryTitle(sql, {'id':'10000'})
 print(fields)
 
 print(oraDb.queryBy(sql, {'id':'10000'}))

def test2():
 oraDb = Oracle('test','java','192.168.0.192','orcl')
 cursor = oraDb.cursor
 
 create_table = """
 CREATE TABLE python_modules (
 module_name VARCHAR2(50) NOT NULL,
 file_path VARCHAR2(300) NOT NULL
 )
 """
 from sys import modules
 
 cursor.execute(create_table)
 M = []
 for m_name, m_info in modules.items():
 try:
  M.append((m_name, m_info.__file__))
 except AttributeError:
  pass
 
 sql = "INSERT INTO python_modules(module_name, file_path) VALUES (:1, :2)"
 oraDb.insertBatch(sql,M)
 
 cursor.execute("SELECT COUNT(*) FROM python_modules")
 print(cursor.fetchone())
 print('insert batch ok.')
 cursor.execute("DROP TABLE python_modules PURGE")
test2()

以上这篇python操作oracle的完整教程分享就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python发送邮件的实例代码(支持html、图片、附件)
Mar 04 Python
在Python的Bottle框架中使用微信API的示例
Apr 23 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
Aug 08 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
May 07 Python
教你利用Python玩转histogram直方图的五种方法
Jul 30 Python
对Python 内建函数和保留字详解
Oct 15 Python
Python编程深度学习计算库之numpy
Dec 28 Python
使用OpenCV实现仿射变换—旋转功能
Aug 29 Python
python编程进阶之类和对象用法实例分析
Feb 21 Python
python time()的实例用法
Nov 03 Python
jupyter 添加不同内核的操作
Feb 06 Python
Python使用wxPython实现计算器
Jan 30 #Python
python链接oracle数据库以及数据库的增删改查实例
Jan 30 #Python
python实现简易版计算器
Jun 22 #Python
python列表的增删改查实例代码
Jan 30 #Python
Python+tkinter使用40行代码实现计算器功能
Jan 30 #Python
Python Tkinter实现简易计算器功能
Jan 30 #Python
python使用tkinter实现简单计算器
Jan 30 #Python
You might like
php中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
nginx+php-fpm配置文件的组织结构介绍
2012/11/07 PHP
简单实用的js调试logger组件实现代码
2010/11/20 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
jqgrid 编辑添加功能详细解析
2013/11/08 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
浅谈javascript六种数据类型以及特殊注意点
2013/12/20 Javascript
jQuery中offset()方法用法实例
2015/01/16 Javascript
jQuery事件绑定on()、bind()与delegate() 方法详解
2015/06/03 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
js replace 全局替换的操作方法
2018/06/12 Javascript
vue.js与后台数据交互的实例讲解
2018/08/08 Javascript
原生JS实现图片懒加载之页面性能优化
2019/04/26 Javascript
实现高性能javascript的注意事项
2019/05/27 Javascript
JavaScript常用内置对象用法分析
2019/07/09 Javascript
javascript实现移动端红包雨页面
2020/06/23 Javascript
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
2020/09/21 Javascript
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python数据结构链表之单向链表(实例讲解)
2017/07/25 Python
Android分包MultiDex策略详解
2017/10/30 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
python如何爬取网站数据并进行数据可视化
2019/07/08 Python
使用Python pip怎么升级pip
2020/08/11 Python
重构Python代码的六个实例
2020/11/25 Python
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
浅谈CSS3中display属性的Flex布局的方法
2017/08/14 HTML / CSS
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
美国Max仓库:Max Warehouse
2020/05/31 全球购物
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
解释i节点在文件系统中的作用
2013/11/26 面试题
入党积极分子介绍信
2014/01/17 职场文书
二年级评语大全
2014/04/23 职场文书
大学生先进个人主要事迹材料
2015/11/04 职场文书