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实现测试磁盘性能的方法
Mar 12 Python
Python中的变量和作用域详解
Jul 13 Python
Python实现读取并保存文件的类
May 11 Python
Python实现多级目录压缩与解压文件的方法
Sep 01 Python
python遍历小写英文字母的方法
Jan 02 Python
如何利用Anaconda配置简单的Python环境
Jun 24 Python
pycharm设置鼠标悬停查看方法设置
Jul 29 Python
Django models文件模型变更错误解决
May 11 Python
基于Python爬虫采集天气网实时信息
Jun 05 Python
Python 字典中的所有方法及用法
Jun 10 Python
django有哪些好处和优点
Sep 01 Python
Python 带星号(* 或 **)的函数参数详解
Feb 23 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
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
php若干单维数组遍历方法的比较
2011/09/20 PHP
php 字符串压缩方法比较示例
2014/01/23 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
50个PHP程序性能优化的方法
2014/06/02 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
PHP中非常有用却鲜有人知的函数集锦
2019/08/17 PHP
js split 的用法和定义 js split分割字符串成数组的实例代码
2012/05/13 Javascript
js计算精度问题小结
2013/04/22 Javascript
jquery实现简单易懂的图片展示小例子
2013/11/21 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
浅谈pc端rem字体设置的问题
2017/08/03 Javascript
Express系列之multer上传的使用
2017/10/27 Javascript
JS中的算法与数据结构之集合(Set)实例详解
2019/08/20 Javascript
JavaScript中使用Spread运算符的八种方法总结
2020/06/18 Javascript
[04:29]2014DOTA2国际邀请赛 主赛事第三日TOPPLAY
2014/07/21 DOTA
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
web.py在模板中输出美元符号的方法
2014/08/26 Python
详解Python中with语句的用法
2015/04/15 Python
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
Python优先队列实现方法示例
2017/09/21 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
2020/02/07 Python
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
htnl5利用svg页面高斯模糊的方法
2018/07/20 HTML / CSS
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
教育学习自我评价
2014/02/03 职场文书
恶搞卫生巾广告词
2014/03/18 职场文书
四群教育工作实施方案
2014/03/26 职场文书
11.9消防日宣传标语
2014/10/08 职场文书
教师个人考察材料
2014/12/16 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书
2019脱贫攻坚工作总结报告范本!
2019/08/06 职场文书
导游词之贵州织金洞
2019/10/12 职场文书
MySQL 数据 data 基本操作
2022/05/04 MySQL
利用Python实时获取steam特惠游戏数据
2022/06/25 Python