Oracle——python的基本操作

原文:https://www.cnblogs.com/xiao-apple36/p/9066980.html#_label6

阅读目录

  1. python操作oracle数据库-查询
  2. DB API 2.0 和 cx_Oracle 介绍
  3. 第一步:导入cx_Oracle ,建立连接
  4. 第二步:建立 Cursor 光标,查询
  5. 数据类型
  6. 绑定变量模式
  7. 一次多行


回到顶部

python操作oracle数据库-查询

参照文档

http://www.oracle.com/technetwork/cn/articles/dsl/mastering-oracle-python-1391323-zhs.html

http://cx-oracle.readthedocs.io/en/latest/module.html

回到顶部

DB API 2.0 和 cx_Oracle 介绍

Python 数据库 API 规范 v2.0 是集体努力的成果,用于统一不同数据库系统的访问模型。拥有一组相对较少的方法和属性,在更换数据库供应商时就易于学习并保持一致。它不以任何方式将数据库对象映射到 Python 结构中。用户仍然需要手工编写 SQL。在更换到另一数据库后,此 SQL 可能需要重新编写。尽管如此,它还是出色妥善地解决了 Python 数据库的连接性问题。

该规范定义了 API 的各个部分,如模块接口、连接对象、游标对象、类型对象和构造器、DB API 的可选扩展以及可选的错误处理机制。

数据库和 Python 语言之间的网关是连接对象。它包含制作数据库驱动的应用程序所需的全部组件,不仅符合 DB API 2.0,而且是规范方法和属性的一个超集。在多线程的程序中,模块和连接可以在不同线程间共享,但是不支持游标共享。这一限制通常是可接受的,因为共享游标可能带来死锁风险。

Python 大量使用了异常模型,DB API 定义了若干标准异常,它们在调试应用程序中的问题时会非常有用。下面是一些标准异常,同时提供了原因类型的简要说明:

  • Warning — 数据在执行插入操作时被截断,等等
  • Error — 这里提到的除 Warning 外的所有异常的基类。
  • InterfaceError — 数据库接口而非数据库本身故障(本例为 cx_Oracle 问题)
  • DatabaseError — 严格意义上的数据库问题
  • DataError — 包含如下结果数据的问题除数为 0,值超出范围等
  • OperationalError — 与编程人员无关的数据库错误:连接丢失、内存分配错误、事务处理错误等
  • IntegrityError — 数据库的关系完整性受到了影响,例如,外键约束失败
  • InternalError — 数据库遇到内部错误,例如,游标无效、事务不同步
  • ProgrammingError — 未找到表、SQL 语句中的语法错误、指定参数的数量错误等
  • NotSupportedError — 调用的 API 部件并不存在

连接过程首先从连接对象开始,这是创建游标对象的基础。除游标操作外,连接对象还使用 commit() 和 rollback() 方法对事务进行管理。执行 SQL 查询、发出 DML/DCL 语句和获取结果这些过程均受游标控制。

回到顶部

第一步:导入cx_Oracle ,建立连接

>>> import cx_Oracle
>>> db = cx_Oracle.connect(‘hr‘, ‘hrpwd‘, ‘localhost:1521/XE‘)
>>> db1 = cx_Oracle.connect(‘hr/[email protected]:1521/XE‘)
>>> dsn_tns = cx_Oracle.makedsn(‘localhost‘, 1521, ‘XE‘)
>>> print dsn_tns
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SID=XE)))
>>> db2 = cx_Oracle.connect(‘hr‘, ‘hrpwd‘, dsn_tns)
# 通过客户端连接oracleconnection = cx_Oracle.connect(‘test/[email protected]‘)

回到顶部

第二步:建立 Cursor 光标,查询

您可以使用连接对象的 cursor() 方法定义任意数量的游标。简单的程序使用一个游标就可以了,该游标可以一再地重复使用。但较大的项目可能要求几个不同的游标。

>>> cursor = db.cursor()

应用程序逻辑通常需要明确区分针对数据库发出的语句的各个处理阶段。这有助于更好地理解性能瓶颈并编写更快且经过优化的代码。语句处理分三个阶段:

  1. 分析(可选)

    • cx_Oracle.Cursor.parse([statement]) 
      实际上并不需要调用,因为在执行阶段会自动分析 SQL 语句。该方法可以用于在执行语句前对其进行验证。当这类语句中检测出错误时,会引发 DatabaseError 异常,相应的错误消息通常可能是“ORA-00900:invalid SQL statement, ORA-01031:insufficient privileges or ORA-00921:unexpected end of SQL command.”
  2. 执行
    • cx_Oracle.Cursor.execute(statement, [parameters], **keyword_parameters)
      此方法可以接受单个参数 — 一条 SQL 语句 — 直接针对数据库来运行。通过 parameters 或 keyword_parameters 参数赋值的绑定变量可以指定为字典、序列或一组关键字参数。如果已经提供了字典或关键字参数,那么这些值将与名称绑定。如果给出的是序列,将根据这些值的位置对它们进行解析。如果是查询操作,此方法返回一个变量对象列表;如果不是,则返回 None。
    • cx_Oracle.Cursor.executemany(statement, parameters)
      对于批量插入尤其有用,因为它可以将所需的 Oracle 执行操作的数量限制为仅一个。有关如何使用该方法的详细信息,请参见下面的“一次多行”部分。
  3. 获取(可选)— 仅用于查询(因为 DDL 和 DCL 语句不返回结果)。在不执行查询的游标上,这些方法将引发 InterfaceError 异常。
    • cx_Oracle.Cursor.fetchall() 
      以字节组列表形式获取结果集中的所有剩余行。如果没有剩余的行,它返回一个空白列表。获取操作可以通过设置游标的 arraysize 属性进行调整,该属性可设置在每个底层请求中从数据库中返回的行数。arraysize 的设置越高,需要在网络中往返传输的次数越少。arraysize 的默认值为 1。
    • cx_Oracle.Cursor.fetchmany([rows_no]) 
      获取数据库中接下来的 rows_no 行。如果该参数未指定,该方法获取的行数是 arraysize 的数量。如果 rows_no 大于获取到的行的数目,该方法获取的行数是剩余的行数。
    • cx_Oracle.Cursor.fetchone() 
      从数据库中获取单个字节组,如果没有剩余行,则返回 none。

在继续了解游标示例前,请先了解 pprint 模块的 pprint 函数。它用于以清晰、可读的形式输出 Python 数据结构。

# 获得游标对象
cursor = connection.cursor ()

try:
    # 解析sql语句
    cursor.parse("select *  dual")
    # 捕获SQL异常
except cx_Oracle.DatabaseError as e:
    print(e)   # ORA-00923: 未找到要求的 FROM 关键字

# 执行sql 语句
cursor.execute ("select * from dual")
# 提取一条数据,返回一个元祖
row = cursor.fetchone()
pprint(row)  # (‘X‘,)

回到顶部

数据类型

在获取阶段,基本的 Oracle 数据类型会映射到它们在 Python 中的等同数据类型中。cx_Oracle 维护一个单独的、有助于这一转换的数据类型集合。Oracle - cx_Oracle - Python 映射为

查询列字段信息

# 查询列字段信息
column_data_types = cursor.execute(‘SELECT * FROM python_modules‘)
pprint(column_data_types.description)
# [(‘MODULE_NAME‘, <class ‘cx_Oracle.STRING‘>, 50, 50, None, None, 0),
#  (‘FILE_PATH‘, <class ‘cx_Oracle.STRING‘>, 300, 300, None, None, 0)]

回到顶部

绑定变量模式

正如 Oracle 大师 Tom Kyte 介绍的那样,绑定变量是数据库开发的核心原则。它们不仅使程序运行更快,同时可以防范 SQL 注入攻击。

按名称传递绑定变量要求执行方法的 parameters 参数是一个字典或一组关键字参数。下面的 query1 和 query2 是等同的:

>>> named_params = {‘dept_id‘:50, ‘sal‘:1000}
>>> query1 = cursor.execute(‘SELECT * FROM employees WHERE department_id=:dept_id AND salary>:sal‘, named_params)
>>> query2 = cursor.execute(‘SELECT * FROM employees WHERE department_id=:dept_id AND salary>:sal‘, dept_id=50, sal=1000)

在使用已命名的绑定变量时,您可以使用游标的 bindnames() 方法检查目前已指定的绑定变量:

>>> print cursor.bindnames()
[‘DEPT_ID‘, ‘SAL‘]

# 绑定变量模式查询
named_params = {‘MODULE_NAME‘: ‘cx_Oracle‘}
cursor.execute(‘SELECT * FROM python_modules where MODULE_NAME =:MODULE_NAME‘,named_params)
# 在使用已命名的绑定变量时,您可以使用游标的 bindnames() 方法检查目前已指定的绑定变量:
print(cursor.bindnames())
pprint(cursor.fetchone())
# (‘cx_Oracle‘,
#  ‘C:\\Program ‘
#  ‘Files\\Python36\\lib\\site-packages\\cx_Oracle.cp36-win_amd64.pyd‘)

# 在绑定时,您可以首先准备该语句,然后利用改变的参数执行 None。
# 根据绑定变量时准备一个语句即足够这一原则,
# Oracle 将如同在上例中一样对其进行处理。准备好的语句可执行任意次。
cursor.prepare(‘SELECT * FROM python_modules where MODULE_NAME =:MODULE_NAME‘)
cursor.execute(None, named_params)
pprint(cursor.fetchone())
# (‘cx_Oracle‘,
#  ‘C:\\Program ‘
#  ‘Files\\Python36\\lib\\site-packages\\cx_Oracle.cp36-win_amd64.pyd‘)

回到顶部

一次多行

大型的插入操作不需求多次的单独插入,这是因为 Python 通过 cx_Oracle.Cursor.executemany 方法完全支持一次插入多行。

限制执行操作的数量极大地改善了程序性能,因此在编写存在大量插入操作的应用程序时应首先考虑这一功能。 
我们首先为 Python 模块列表创建一个表,这次直接从 Python 开始。您将在以后删除该表。

import cx_Oracle
# 用于以清晰、可读的形式输出 Python 数据结构
from pprint import pprint
from sys import modules

# 通过客户端连接oracle
connection = cx_Oracle.connect(‘test/[email protected]‘)

print(connection.version)

# 获得游标对象
cursor = connection.cursor ()

try:
    # 解析sql语句
    cursor.parse("select *  dual")
    # 捕获SQL异常
except cx_Oracle.DatabaseError as e:
    print(e)   # ORA-00923: 未找到要求的 FROM 关键字

# 执行sql 语句
cursor.execute ("select * from dual")
# 提取一条数据,返回一个元祖
row = cursor.fetchone()
pprint(row)  # (‘X‘,)

create_table = """
CREATE TABLE python_modules (
module_name VARCHAR2(50) NOT NULL,
file_path VARCHAR2(300) NOT NULL
)
"""
# 执行创建表
create_flag = cursor.execute(create_table)

# 添加模块信息
M = []
for m_name, m_info in modules.items():
    try:
        M.append((m_name, m_info.__file__))
    except AttributeError:
        pass

print(len(M))

insert_sql = "INSERT INTO python_modules(module_name, file_path) VALUES (:1, :2)"

# 在prepare之后,你再去execute的时候,就不用写上sql语句参数了
cursor.prepare(insert_sql)
cursor.executemany(None, M)  # 注意,第一个参数是None
connection.commit()  # 提交

# 查询
r = cursor.execute("SELECT COUNT(*) FROM python_modules")
pprint(cursor.fetchone())

# 查询列字段信息
column_data_types = cursor.execute(‘SELECT * FROM python_modules‘)
pprint(column_data_types.description)
# [(‘MODULE_NAME‘, <class ‘cx_Oracle.STRING‘>, 50, 50, None, None, 0),
#  (‘FILE_PATH‘, <class ‘cx_Oracle.STRING‘>, 300, 300, None, None, 0)]

# 取10条记录信息
pprint(len(cursor.fetchmany(10)))  # 10

# 取之后所有记录信息,不包括前10条
pprint(len(cursor.fetchall()))  # 41

# 绑定变量模式查询
named_params = {‘MODULE_NAME‘: ‘cx_Oracle‘}
cursor.execute(‘SELECT * FROM python_modules where MODULE_NAME =:MODULE_NAME‘,named_params)
# 在使用已命名的绑定变量时,您可以使用游标的 bindnames() 方法检查目前已指定的绑定变量:
print(cursor.bindnames())
pprint(cursor.fetchone())
# (‘cx_Oracle‘,
#  ‘C:\\Program ‘
#  ‘Files\\Python36\\lib\\site-packages\\cx_Oracle.cp36-win_amd64.pyd‘)

# 在绑定时,您可以首先准备该语句,然后利用改变的参数执行 None。
# 根据绑定变量时准备一个语句即足够这一原则,
# Oracle 将如同在上例中一样对其进行处理。准备好的语句可执行任意次。
cursor.prepare(‘SELECT * FROM python_modules where MODULE_NAME =:MODULE_NAME‘)
cursor.execute(None, named_params)
pprint(cursor.fetchone())
# (‘cx_Oracle‘,
#  ‘C:\\Program ‘
#  ‘Files\\Python36\\lib\\site-packages\\cx_Oracle.cp36-win_amd64.pyd‘)

# 删除python_modules
cursor.execute("DROP TABLE python_modules PURGE")

# 关闭游标
cursor.close()
# 关闭连接
connection.close ()

# BLOB & CLOB 格式的创建:
#
# binary_content = cursor.var(cx_Oracle.BLOB)
# binary_content.setvalue(0, content)

原文地址:https://www.cnblogs.com/heymonkey/p/12177495.html

时间: 2024-10-04 04:31:27

Oracle——python的基本操作的相关文章

Oracle数据的基本操作

一.什么是Oracle 在学习DRP系统之前,很多次提到过Oracle,也了解过,那么Oracle是什么?今天我终于揭开了它的神秘面纱. Oracle:是一个公司,当然我在这里说的是Oracle数据库,与之前学到的SQLserver一样,都是一种关系型数据库管理系统.由于Oracle对大型的数据处理快速,所以称之为企业级数据库,而SQLserver是中小型的数据库. 二.基本操作 了解了什么是Oracle之后,那么就先从基本操作来熟悉下Oracle数据库吧. 1.Oracle数据库的安装 这个我

Python SQLAlchemy基本操作和常用技巧包含大量实例,非常好python

http://www.makaidong.com/%E8%84%9A%E6%9C%AC%E4%B9%8B%E5%AE%B6/28053.shtml "Python SQLAlchemy基本操作和常用技巧包含大量实例,非常好python":关键词:python sqlalchemy 基本 操 作和 常用 技巧 包含 大量 实例 非常好 python 首先说下,由于最新的 0.8 版还是开发版本,因此我使用的是 0.79 版,api 也许会有些不同.因为我是搭配 mysql innodb

python 字典基本操作

python 中的字典属于一种高级数据结构,基于的基本数据结构是hash表,hash表在查找某一元素中的复杂度基本上等于O(1),因此是非常好用的数据结构.下面简介一下资本的一些字典的操作 一.创建字典,给字典赋值 NameRank={} NameRank={1:ada,2:aka,3:jia,4:gxy} 创建字典有以上两种方式,可以直接初始化中给出赋值,也可以直接创建,字典赋值操作如下 NameRank[key]=value 二.字典的基本操作 1.访问adict[key] 形式返回键key

ORACLE+PYTHON实战:复制A表数据到B表

最近在学习python ,看到了pythod的oracle,不仅可以一次fetch多条,也可以一次insert多条,想写一个复制A表数据到B表的程序来看看实际效率能不能提高.写完发现,非常惊艳!效率提升了近一倍! 当然可能会认为这个没有实际意义,其实不然. 从A表复制数据到B表有很多中方法,一般直接insert即可: insert into tableA select * from tableB ; 但是当数据量非常大时,到达上亿水准的时候,这样做就很郁闷了,因为本身会跑很慢,又看不到进度,偶尔

oracle+python+pycharm+win系统 问题解决

1.::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::(注意版本   按我的来,数据库按公司来) 电脑指定安装oracle 为oracle.11(自己网上找包下载或者官网) python安装为 3.6.5(习惯用) pycharm随意(只是用来写代码) cx_oracle 安装网址https://pypi.org/project/cx-Oracle/5.3/#files    (5.3) 按我上面的版本应该没啥问题 

python序列基本操作

这里讲一基本概念:容器---可以包含其他对象的对象:两种主要的容器是序列(列表和元祖)和映射(字典) 关于序列的通用基本操作:python中常用的序列主要有两种:列表和元祖  -------索引,切片,相加,相乘和资格检查 1.索引:序列中的所有元素都有编号,从0开始 names='xiaoyan' print(names[0])print(names[3])print(names[-1])结果: 2.切片:访问特定范围的元素 names='xiaoyan' print(names[0:3])

oracle python

#!/usr/bin/python import csv import cx_Oracle tns_name = cx_Oracle.makedsn('192.168.1.230','1521','hfpboc') db = cx_Oracle.connect('hfpboc','hfpboc',tns_name) cursor = db.cursor() f = open("cardacc.csv","w") writer = csv.writer(f,linet

Matlab如何连接Oracle数据库及基本操作

语言和语法都是相通的,了解Oracle的连接和处理,对于其他的数据库也是类似的. 一 通过ODBC实现到oracle的连接 1)控制面板->管理工具->ODBC数据源->在系统DSN中添加oracle数据源: 2)matlab命令行中输入建立连接的命令: conn_odbc = database('QUIK', ... %ODBC名称 'QUIK', ... %登录用户名 'QUIK') %登录密码 二 通过JDBC建立与oracle的连接 1)找到jdbc的驱动程序文件D:\oracl

学习Python旅程之一Python的基本操作环境

环境变量配置 程序和可执行文件可以在许多目录,而这些路径很可能不在操作系统提供可执行文件的搜索路径中.path(路径)存储在环境变量中,这是由操作系统维护的一个命名的字符串.这些变量包含可用的命令行解释器和其他程序的信息.Unix或Windows中路径变量PATH(UNIX区分大小写,Windows不区分大小写).在Mac OS中,安装程序过程中改变了python的安装路径.如果你需要在其他目录引用Python,你必须在path中添加Python目录. 在 Unix/Linux 设置环境变量 在