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 相关文章推荐
通过mod_python配置运行在Apache上的Django框架
Jul 22 Python
Python实现Linux命令xxd -i功能
Mar 06 Python
python实现验证码识别功能
Jun 07 Python
python 列表降维的实例讲解
Jun 28 Python
numpy中loadtxt 的用法详解
Aug 03 Python
python中文编码与json中文输出问题详解
Aug 24 Python
python的schedule定时任务模块二次封装方法
Feb 19 Python
np.dot()函数的用法详解
Jan 17 Python
Python变量作用域LEGB用法解析
Feb 04 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
Mar 06 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
May 22 Python
Flask中sqlalchemy模块的实例用法
Aug 02 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一些十分严重的缺陷详解
2013/06/03 PHP
PHP中的reflection反射机制测试例子
2014/08/05 PHP
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
2014/10/21 PHP
php使用fsockopen函数发送post,get请求获取网页内容的方法
2014/11/15 PHP
windows下安装php的memcache模块的方法
2015/04/07 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
2018/08/21 PHP
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
jquery+ajax每秒向后台发送请求数据然后返回页面的代码
2011/01/17 Javascript
Textarea根据内容自适应高度
2013/10/28 Javascript
谈谈我对JavaScript中typeof和instanceof的深入理解
2015/12/25 Javascript
用nodejs的实现原理和搭建服务器(动态)
2016/08/10 NodeJs
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
jquery popupDialog 使用 加载jsp页面的方法
2016/10/25 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
NodeJS模块与ES6模块系统语法及注意点详解
2019/01/04 NodeJs
JSON的parse()方法介绍
2019/01/31 Javascript
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
Python Json数据文件操作原理解析
2020/05/09 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
Python 中如何使用 virtualenv 管理虚拟环境
2021/01/21 Python
咨询公司各岗位职责
2013/12/02 职场文书
大众服装店创业计划书范文
2014/01/01 职场文书
社区志愿者心得体会
2014/01/03 职场文书
学期研究性学习个人的自我评价
2014/01/09 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
物流管理专业毕业生求职信
2014/03/23 职场文书
推荐信怎么写
2014/05/09 职场文书
社区服务标语
2014/07/01 职场文书
2014年材料员工作总结
2014/11/19 职场文书
五年级下册复习计划
2015/01/19 职场文书
南京导游词
2015/02/03 职场文书
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript