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 Web框架Flask中使用新浪SAE云存储实例
Feb 08 Python
Django中更新多个对象数据与删除对象的方法
Jul 17 Python
Python实现调度算法代码详解
Dec 01 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
Feb 11 Python
pandas实现选取特定索引的行
Apr 20 Python
Python中存取文件的4种不同操作
Jul 02 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
Dec 24 Python
解析python的局部变量和全局变量
Aug 15 Python
python框架django项目部署相关知识详解
Nov 04 Python
Flask框架路由和视图用法实例分析
Nov 07 Python
python写一个随机点名软件的实例
Nov 28 Python
Pytorch之扩充tensor的操作
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
php中smarty模板条件判断用法实例
2015/06/11 PHP
CodeIgniter配置之config.php用法实例分析
2016/01/19 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
php正则表达式基本知识与应用详解【经典教程】
2017/04/17 PHP
PHP实现PDO操作mysql存储过程示例
2019/02/13 PHP
jQuery Ajax请求状态管理器打包
2012/05/03 Javascript
用box固定长宽实现图片自动轮播js代码
2014/06/09 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
jQuery中element选择器用法实例
2014/12/29 Javascript
详解JavaScript中getFullYear()方法的使用
2015/06/10 Javascript
JavaScript学习笔记整理_关于表达式和语句
2016/09/19 Javascript
Node.js制作简单聊天室
2017/01/12 Javascript
js实现日历的简单算法
2017/01/24 Javascript
JS实现页面打印(整体、局部)
2017/08/18 Javascript
详解Node全局变量global模块
2017/09/28 Javascript
JS设计模式之惰性模式(二)
2017/09/29 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
JS实现使用POST方式发送请求
2019/08/30 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
2020/06/05 Javascript
[04:47]DOTA2-潍坊风行电子俱乐部探秘
2014/08/08 DOTA
Python实现栈的方法
2015/05/26 Python
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
python使用epoll实现服务端的方法
2018/10/16 Python
python3使用QQ邮箱发送邮件
2020/05/20 Python
Python操作SQLite数据库过程解析
2019/09/02 Python
使用apiDoc实现python接口文档编写
2019/11/19 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
竞聘上岗演讲稿范文
2014/01/10 职场文书
班级旅游计划书
2014/05/03 职场文书
求职意向书
2014/07/29 职场文书
政风行风整改报告
2014/11/06 职场文书
教师工作态度自我评价
2015/03/05 职场文书
2015仓库保管员年终工作总结
2015/05/13 职场文书
Windows下redis下载、redis安装及使用教程
2021/06/02 Redis