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中enumerate的用法实例解析
Aug 18 Python
Python的Flask框架中@app.route的用法教程
Mar 31 Python
Python字符和字符值(ASCII或Unicode码值)转换方法
May 21 Python
Python数据类型详解(一)字符串
May 08 Python
Windows下搭建python开发环境详细步骤
Jul 20 Python
Python编程中实现迭代器的一些技巧小结
Jun 21 Python
Python global全局变量函数详解
Sep 18 Python
利用python修改json文件的value方法
Dec 31 Python
python实现矩阵打印
Mar 02 Python
如何在scrapy中捕获并处理各种异常
Sep 28 Python
Python页面加载的等待方式总结
Feb 28 Python
使用Python webdriver图书馆抢座自动预约的正确方法
Mar 04 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
模仿OSO的论坛(五)
2006/10/09 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
jquery 操作DOM的基本用法分享
2012/04/05 Javascript
Area 区域实现post提交数据的js写法
2014/04/22 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
2016/09/17 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
Bootstrap中glyphicons-halflings-regular.woff字体报404错notfound的解决方法
2017/01/19 Javascript
Vue.js实现简单动态数据处理
2017/02/13 Javascript
使用jQuery 操作table 完成单元格合并的实例
2017/12/27 jQuery
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
微信小程序显示倒计时功能示例【测试可用】
2018/12/03 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
Nuxt.js实现一个SSR的前端博客的示例代码
2019/09/06 Javascript
浅析Python基础-流程控制
2016/03/18 Python
ubuntu系统下 python链接mysql数据库的方法
2017/01/09 Python
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
使用python装饰器计算函数运行时间的实例
2018/04/21 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
2018/07/10 Python
详解django中url路由配置及渲染方式
2019/02/25 Python
python每天定时运行某程序代码
2019/08/16 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
HTTP状态码详解
2021/03/18 杂记
初三新学期计划书
2014/05/03 职场文书
妇联主席先进事迹
2014/05/18 职场文书
2014年第四季度入党积极分子思想汇报(十八届四中全会)
2014/11/03 职场文书
感谢信怎么写
2015/01/21 职场文书
房地产销售主管岗位职责
2015/02/13 职场文书
团委工作总结2015
2015/04/02 职场文书
学生党支部工作总结2015
2015/05/26 职场文书
MySQL入门命令之函数-单行函数-流程控制函数
2021/04/05 MySQL
CSS SandBox应用场景及常见问题
2022/06/25 HTML / CSS