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详细教程_[宜配屋]听图阁相关推荐

  1. python turtle画房子详细解释_[宜配屋]听图阁

    我就废话不多说了,直接上代码吧! import turtle t=turtle.Turtle() turtle.Turtle().screen.delay(0) tleft=turtle.Turtle ...

  2. python对数组的基本操作_[宜配屋]听图阁

    这篇文章主要介绍了简单了解python数组的基本操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一,创建列表 创建一个列表,只要把逗号分隔的不同 ...

  3. python开发一个彩票系统_[宜配屋]听图阁

    本文为大家分享了python实现彩票系统的具体代码,供大家参考,具体内容如下 功能:1.注册  2.登录  3.充钱   4.提现  5.下注  6.开奖  7.退出 简述:彩民需要用身份证号码开户注 ...

  4. python求超级素数代码_[宜配屋]听图阁

    如果一个数字能表示成 p^q,且p是一个素数,q为大于1的正整数,则此数字就是超级素数幂. param number: 测试该数字是否是超级素数幂 return: 如果不是就返回 False,如果是就 ...

  5. python做excel表格代码_[宜配屋]听图阁

    安装两个库:pip install xlrd.pip install xlwt 1.python读excel--xlrd 2.python写excel--xlwt 1.读excel数据,包括日期等数据 ...

  6. python计算圆的体积_[宜配屋]听图阁

    在已知DICOM和三维模型对应掩膜的情况下,计算三维模型的体积. 思路: 1.计算每个体素的体积.每个体素为长方体,x,y为PixelSpacing,z为层间距 使用pydicom.read_file ...

  7. 关于python格式对齐的问题_[宜配屋]听图阁 - 浅谈python str.format与制表符\t关于中文对齐的细节问题...

    写了一个练手的爬虫...在输出的时候出现了让人很不愉♂悦的问题 像这样: 令人十分难受啊! #------------------------------------------ 在此之前先说一下py ...

  8. python可以翻墙吗_[宜配屋]听图阁

    那堵墙着实可恨!身处IT这个圈子,经常需要用gg查资料(你也可以用来访问1024,^_^...).当然,你也可以用百度.其实也不是我不爱用百度,是有缘由的,且听我细细道来.有一次闲得蛋疼,想看看会不会 ...

  9. python身份证号码解析编程_[宜配屋]听图阁

    中国的居民身份证有18位.其中前17位是信息码,最后1位是校验码.每位信息码可以是0-9的数字,而校验码可以是0-9或X,其中X表示10. 身份证校验码算法: 设18位身份证号序列从左到右为: 引用 ...

最新文章

  1. Linux Kernel TCP/IP Stack — L1 Layer — NIC Controller — Buffer descriptor table
  2. Spring Boot集成Elastic Search
  3. 大年初一,给大家发1000红包!
  4. Linux常用命令(第二版) --帮助命令
  5. 57.should merge Js
  6. sh与bash中的export语法的区别
  7. CPLEX-求解VRPTW模型
  8. Nginx源码编译安装
  9. 手把手教你学习DSP_硬件设计
  10. android 添加字幕,字幕添加器app-字幕添加器安卓版v2.0.1 - 起点软件园
  11. mysql如何获取当前时间_mysql怎么获取当前时间
  12. 安卓超级压缩管理器(ZArchiver) 汉化版 v0.5
  13. springboot自动装配流程图
  14. 一个2022本科生的秋招总结 (大疆、Arm、小米、荣耀、美团、联发科等)
  15. 秒杀笔记(乐观锁+令牌桶+Redis缓存)
  16. 数学之美番外篇:进化论中的概率论
  17. c语言阿基米德螺旋线编程,阿基米德螺旋线进刀凸轮外轮廓铣削的编程技巧
  18. Swift入门笔记(二)
  19. 2019牛客暑期多校训练营(第七场)-B Irreducible Polynomial(多项式因式分解)
  20. java中文字符_Java 完美判断中文字符

热门文章

  1. SAP gateway GWaaS single sign on
  2. nodejs项目npm start背后的工作原理
  3. 腾讯云加入自媒体分享计划可以免费领取.cn域名啦
  4. COM_TEXT_GET_SWITCH
  5. SAP APF框架错误消息Filter is too complex的处理
  6. 使用windows activeX 在Webclient UI 中打开word文档
  7. SAP传统电商解决方案的技术挑战以及SAP的应对措施
  8. SAP CRM HANA report filter的工作原理
  9. 推荐一个高质量的git命名查询和学习的github仓库git-recipes
  10. 如何检查某个用户是否具有某个权限对象上定义的某种权限