python操作oracle数据库

概述

本文讲解python操作oracle数据库,步骤如下:

  1. 连接数据库
  2. 获取 游标
  3. 执行 SQL,进行 增删改查(CRUD) 操作
    • 如果是select语句,获取 查询 结果
    • 如果是insert、update、delete语句,需要 提交 或 回滚 事务
  4. 关闭游标
  5. 关闭数据库连接

官方文档:
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()方法需要 驱动 支持


原文出处:/show_1EF364lXkRrU.html