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使用cookielib库示例分享
Mar 03 Python
python实现自动登录人人网并访问最近来访者实例
Sep 26 Python
Python中的with...as用法介绍
May 28 Python
分数霸榜! python助你微信跳一跳拿高分
Jan 08 Python
python tkinter组件使用详解
Sep 16 Python
Python中的上下文管理器相关知识详解
Sep 19 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
Dec 31 Python
Python GUI库PyQt5图形和特效样式QSS介绍
Feb 25 Python
python模拟点击网页按钮实现方法
Feb 25 Python
jupyter notebook的安装与使用详解
May 18 Python
如何用python识别滑块验证码中的缺口
Apr 01 Python
python实现socket简单通信的示例代码
Apr 13 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目录操作函数之获取目录与文件的类型
2010/12/29 PHP
php.ini修改php上传文件大小限制的方法详解
2013/06/17 PHP
PHP关键特性之命名空间实例详解
2017/05/06 PHP
PHP实现支持CURL字符串证书传输的方法
2019/03/23 PHP
使用jquery给input和textarea设定ie中的focus
2008/05/29 Javascript
分享十五个最佳jQuery 幻灯插件和教程
2010/03/27 Javascript
js 事件处理函数间的Event物件是否全等
2011/04/08 Javascript
javascript椭圆旋转相册实现代码
2012/01/16 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
js onclick事件传参讲解
2013/11/06 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
vue打开子组件弹窗都刷新功能的实现
2020/09/21 Javascript
Python迭代器与生成器用法实例分析
2018/07/09 Python
python机器人运动范围问题的解答
2019/04/29 Python
Python数据类型之Tuple元组实例详解
2019/05/08 Python
Python中 Global和Nonlocal的用法详解
2020/01/20 Python
python实现俄罗斯方块小游戏
2020/04/24 Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
2020/08/11 Python
Python控制鼠标键盘代码实例
2020/12/08 Python
红色康乃馨酒店:Red Carnation Hotels
2017/06/22 全球购物
越南电子产品购物网站:FPT Shop
2017/12/02 全球购物
彪马俄罗斯官网:PUMA俄罗斯
2019/07/13 全球购物
光电信息专业应届生求职信
2013/10/07 职场文书
教师的实习自我鉴定
2013/12/17 职场文书
简历自我评价怎么写好呢?
2014/01/04 职场文书
保护环境的建议书
2014/03/12 职场文书
党的群众路线查摆剖析材料
2014/10/10 职场文书
2014年宣传部个人工作总结
2014/12/06 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
2015年新教师工作总结
2015/04/28 职场文书
庆元旦主持词
2015/07/06 职场文书
MySQL GTID复制的具体使用
2022/05/20 MySQL