python连接oracle详细教程_[宜配屋]听图阁
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连接oracle详细教程_[宜配屋]听图阁相关推荐
- python turtle画房子详细解释_[宜配屋]听图阁
我就废话不多说了,直接上代码吧! import turtle t=turtle.Turtle() turtle.Turtle().screen.delay(0) tleft=turtle.Turtle ...
- python对数组的基本操作_[宜配屋]听图阁
这篇文章主要介绍了简单了解python数组的基本操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一,创建列表 创建一个列表,只要把逗号分隔的不同 ...
- python开发一个彩票系统_[宜配屋]听图阁
本文为大家分享了python实现彩票系统的具体代码,供大家参考,具体内容如下 功能:1.注册 2.登录 3.充钱 4.提现 5.下注 6.开奖 7.退出 简述:彩民需要用身份证号码开户注 ...
- python求超级素数代码_[宜配屋]听图阁
如果一个数字能表示成 p^q,且p是一个素数,q为大于1的正整数,则此数字就是超级素数幂. param number: 测试该数字是否是超级素数幂 return: 如果不是就返回 False,如果是就 ...
- python做excel表格代码_[宜配屋]听图阁
安装两个库:pip install xlrd.pip install xlwt 1.python读excel--xlrd 2.python写excel--xlwt 1.读excel数据,包括日期等数据 ...
- python计算圆的体积_[宜配屋]听图阁
在已知DICOM和三维模型对应掩膜的情况下,计算三维模型的体积. 思路: 1.计算每个体素的体积.每个体素为长方体,x,y为PixelSpacing,z为层间距 使用pydicom.read_file ...
- 关于python格式对齐的问题_[宜配屋]听图阁 - 浅谈python str.format与制表符\t关于中文对齐的细节问题...
写了一个练手的爬虫...在输出的时候出现了让人很不愉♂悦的问题 像这样: 令人十分难受啊! #------------------------------------------ 在此之前先说一下py ...
- python可以翻墙吗_[宜配屋]听图阁
那堵墙着实可恨!身处IT这个圈子,经常需要用gg查资料(你也可以用来访问1024,^_^...).当然,你也可以用百度.其实也不是我不爱用百度,是有缘由的,且听我细细道来.有一次闲得蛋疼,想看看会不会 ...
- python身份证号码解析编程_[宜配屋]听图阁
中国的居民身份证有18位.其中前17位是信息码,最后1位是校验码.每位信息码可以是0-9的数字,而校验码可以是0-9或X,其中X表示10. 身份证校验码算法: 设18位身份证号序列从左到右为: 引用 ...
最新文章
- Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — Buffer descriptor table
- Spring Boot集成Elastic Search
- 大年初一,给大家发1000红包!
- Linux常用命令(第二版) --帮助命令
- 57.should merge Js
- sh与bash中的export语法的区别
- CPLEX-求解VRPTW模型
- Nginx源码编译安装
- 手把手教你学习DSP_硬件设计
- android 添加字幕,字幕添加器app-字幕添加器安卓版v2.0.1 - 起点软件园
- mysql如何获取当前时间_mysql怎么获取当前时间
- 安卓超级压缩管理器(ZArchiver) 汉化版 v0.5
- springboot自动装配流程图
- 一个2022本科生的秋招总结 (大疆、Arm、小米、荣耀、美团、联发科等)
- 秒杀笔记(乐观锁+令牌桶+Redis缓存)
- 数学之美番外篇:进化论中的概率论
- c语言阿基米德螺旋线编程,阿基米德螺旋线进刀凸轮外轮廓铣削的编程技巧
- Swift入门笔记(二)
- 2019牛客暑期多校训练营(第七场)-B Irreducible Polynomial(多项式因式分解)
- java中文字符_Java 完美判断中文字符
热门文章
- SAP gateway GWaaS single sign on
- nodejs项目npm start背后的工作原理
- 腾讯云加入自媒体分享计划可以免费领取.cn域名啦
- COM_TEXT_GET_SWITCH
- SAP APF框架错误消息Filter is too complex的处理
- 使用windows activeX 在Webclient UI 中打开word文档
- SAP传统电商解决方案的技术挑战以及SAP的应对措施
- SAP CRM HANA report filter的工作原理
- 推荐一个高质量的git命名查询和学习的github仓库git-recipes
- 如何检查某个用户是否具有某个权限对象上定义的某种权限