概述
本文讲解python操作oracle数据库,步骤如下:
- 连接数据库
- 获取 游标
- 执行 SQL,进行 增删改查(CRUD) 操作
- 如果是select语句,获取 查询 结果
- 如果是insert、update、delete语句,需要 提交 或 回滚 事务
- 关闭游标
- 关闭数据库连接
官方文档:
https://cx-oracle.readthedocs.io/en/latest/
安装模块
安装cx_Oracle模块,在cmd命令窗口执行下面命令
pip install cx_Oracle
依赖 Oracle Database Clients
cx_Oracle连接oracle数据库,需要使用 Oracle Database Clients
所以要先安装 Oracle Database Clients
如果本机已经 安装 oracle数据库,就自带 Oracle Database Clients,所以不需要安装
安装注意:
- 64位python,要使用64位的Oracle Database Clients
- Oracle Database Clients的版本号要与oracle数据库版本号对应
导入模块
import cx_Oracle
连接数据库
语法1
cx_Oracle.connect(user,password,dsn,encoding='')
参数说明
- user:用户名
- password:密码
- dsn:数据库连接,如:
127.0.0.1:1521/SID名 - encoding:编码集
返回值
返回Connection对象
语法2
cx_Oracle.connect(user,encoding='')
参数说明
- url:数据库连接,如:
用户名/密码@127.0.0.1:1521/SID名 - encoding:编码集
返回值
返回Connection对象
连接数据库例子
第一种方式:
#coding=utf-8
import cx_Oracle
#连接数据库
conn=cx_Oracle.connect('scott','tiger','127.0.0.1/oradb',encoding='utf-8')
或者:
#coding=utf-8
import cx_Oracle
#连接数据库
conn=cx_Oracle.connect(user='scott',password='tiger',dsn='127.0.0.1/oradb',encoding='utf-8')
第二种方式:
#coding=utf-8
import cx_Oracle
#连接数据库
conn = cx_Oracle.connect('scott/tiger@localhost/oradb',encoding='utf-8')
或者
#coding=utf-8
import cx_Oracle
#连接数据库
conn = cx_Oracle.connect(user='scott/tiger@localhost/oradb',encoding='utf-8')
错误1:
如果报错如下:
cx_Oracle.DatabaseError: ORA-12541: TNS:no listener
说明没有启动Oracle***TNSListener服务
错误2:
如果报错:
cx_Oracle.DatabaseError: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
就将上面的localhost换成127.0.0.1
连接对象Connection
有以下4个作用:
- 关闭连接
- 获取游标
- 提交事务
- 回滚事务
关闭连接
数据库资源很重要,用完之后要及时关闭连接
conn.close()
获取游标
游标的作用:通过游标对数据库执行 增删改查(CRUD) 操作
# 使用cursor() 方法创建一个游标对象cursor
cursor = conn.cursor ()
提交事务
conn.commit()
回滚事务
conn.rollback()
游标对象 Cursor
通过游标对象,对数据库进行 增删改查 操作
- 执行sql语句
- 获取查询结果(执行select语句)
- 获取行数
- 如果执行select语句,返回查询结果的行数
- 如果执行insert语句,返回插入的行数
- 如果执行update语句,返回更新的行数
- 如果执行delete语句,返回删除的行数
- 关闭游标
注意
一般每次执行sql前 获取游标,执行sql后 关闭游标,不要 一个游标 执行 多个sql
执行sql语句
cursor.execute(sql,params=None)
参数
- sql:sql语句
- params:当sql语句有占位符时,此参数是与占位符对应的参数,可以是list、tuple、dict
预编译sql
数据库将编译优化后的SQL语句缓存起来,下次执行相同结构的语句时,不用再次编译和生成执行计划
cursor.prepare(sql)
参数
- sql:sql语句,可以有占位符
注意:
使用此方法后,还需要调用
cursor.execute(None),而且不要传sql语句,否则执行的是execute()方法的sql语句
获取所有查询结果
cursor.fetchall()
返回值
list类型,list中的元素表示一行记录,类型是tuple
tuple中的元素表示每一列
获取查询结果的下一行(较少使用)
cursor.fetchone()
返回值
tuple类型,tuple中的元素表示每一列
获取查询结果的下几行(较少使用)
cursor.fetchmany(size)
参数
- size:几行
返回值
list类型
获取增删改查的行数
cursor.rowcount
注意:
- 执行select语句时,
- 如果调用fetchall(),rowcount是所有的记录数,
- 如果调用fetchone(),每调用一次该方法,rowcount加1
- 执行insert、delete、update语句时,返回的是影响的行数
关闭游标
游标用完后应及时关闭
cursor.close()
批量执行sql
Cursor.executemany(statement, parameters, batcherrors=False, arraydmlrowcounts=False)
参数说明:
statement:sql语句,如果有预编译方式,此参数为None
parameters:当sql语句有占位符时,此参数是与占位符对应的参数,可以是list、tuple、dict
batcherrors:为True时,即使报错也会继续往下执行。通过
getbatcherrors()方法显示异常
注意: 当执行insert、update、delete时可以为True。arraydmlrowcounts:当执行insert、update、delete时可以为True。
为True时,通过getarraydmlrowcounts()方法,返回每次执行sql影响的行数
注意:getarraydmlrowcounts()方法需要 驱动 支持