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 字典与字符串的互转实例
Jan 13 Python
Python实现数据库并行读取和写入实例
Jun 09 Python
Python反射和内置方法重写操作详解
Aug 27 Python
利用Python脚本实现自动刷网课
Feb 03 Python
详解用Python调用百度地图正/逆地理编码API
Jul 02 Python
Python多线程的退出控制实现
Aug 10 Python
Python引入多个模块及包的概念过程解析
Sep 21 Python
Django数据统计功能count()的使用
Nov 30 Python
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
Mar 29 Python
python 下载文件的几种方式分享
Apr 07 Python
关于pytest结合csv模块实现csv格式的数据驱动问题
May 30 Python
python热力图实现的完整实例
Jun 25 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
php5新改动之短标记启用方法
2008/09/11 PHP
分享下php5类中三种数据类型的区别
2015/01/26 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
Laravel validate error处理,ajax,json示例
2019/10/25 PHP
什么是json和jsonp,jQuery json实例详详细说明
2012/12/11 Javascript
关闭页面时window.location事件未执行的原因分析及解决方案
2014/09/01 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
2015/03/05 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
Treegrid的动态加载实例代码
2016/04/29 Javascript
基于javascript实现按圆形排列DIV元素(二)
2016/12/02 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
2017/08/28 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
vue底部加载更多的实例代码
2018/06/29 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
微信头像地址失效踩坑记附带解决方案
2019/09/23 Javascript
python通过urllib2爬网页上种子下载示例
2014/02/24 Python
python采集博客中上传的QQ截图文件
2014/07/18 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
2018/12/15 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
django 实现手动存储文件到model的FileField
2020/03/30 Python
QT5 Designer 打不开的问题及解决方法
2020/08/20 Python
Kathmandu澳洲户外商店:新西兰户外运动品牌
2017/11/12 全球购物
送给他或她的礼物:FUN.com
2018/08/17 全球购物
文秘大学生求职信
2014/02/25 职场文书
初中毕业生的自我评价
2014/03/03 职场文书
2014年城管工作总结
2014/11/20 职场文书
财务个人年度总结范文
2015/02/26 职场文书
校车安全管理责任书
2015/05/11 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
未来,这5大方向都很适合创业
2019/07/22 职场文书
教师节作文之小学四年级
2019/09/03 职场文书
java设计模式--建造者模式详解
2021/07/21 Java/Android