ITPub博客

首页 > 自动化运维 > DevOps > python数据库模块-Cx_Oracle

python数据库模块-Cx_Oracle

原创 DevOps 作者:ZQqzz 时间:2021-01-25 14:08:26 0 删除 编辑

Cx_oracle 7

cx_Oracle 是一个 Python 扩展模块,它允许 Python 访问 Oracle 数据库。用户通过调用 python 的 cx_oracle 函数,函数内部动态加载 Oracle Client libraries 以访问 Oracle 数据库。

 

特性:

cx_Oracle 功能的亮点是:

 

1. 从 PyPI 轻松安装

2. 支持 Python2 和 3 以及多个 Oracle 数据库版本(支持 Oracle 客户端 11.2 、 12 、 18 和 19 。 Oracle 的标准跨版本互操作性,允许轻松升级和连接到不同的 Oracle 数据库版本。)

3.SQL 和 PL/SQL 语句的执行

4. 广泛的 Oracle 数据类型支持,包括大型对象( CLOB 和 BLOB )和 SQL 对象绑定

5. 连接管理,包括连接池

6.Oracle 数据库高可用性功能

7. 充分利用 Oracle 网络服务基础设施,包括加密网络流量和安全功能

入门

使用安装步骤安装 cx_Oracle :

1. 使用 pip 安装

python -m pip install cx_Oracle --upgrade

2. 将 Oracle 19 、 18 、 12 或 11.2 客户端  client libraries 添加到操作系统库搜索路径中,如 Windows 上的 PATH 或 Linux 上的 LD_library_path 。在 macOS 上,将文件移动到 ~/lib 或 /usr/local/lib 。

相关下载地址: https://www.oracle.com/database/technologies/instant-client.html

 

19, 18,12.2 版本的 client libraries 能连接 Oracle Database 11.2 及以上版本。

12.2 版本的 client libraries 能连接 Oracle Database 10.2 及以上版本。

11.2 版本的 client libraries 能连接 Oracle Database 9.2 及以上版本。

 

创建脚本 query.py ,如下所示:

# query.py

 

from __future__ import print_function

import cx_Oracle

 

# Establish the database connection

connection = cx_Oracle.connect("hr",   userpwd, "dbhost.example.com/orclpdb1")

 

# Obtain a cursor

cursor = connection.cursor()

 

# Data for binding

managerId = 145

firstName = "Peter"

 

# Execute the query

sql = """SELECT first_name, last_name

           FROM employees

         WHERE   manager_id = :mid AND first_name = :fn"""

cursor.execute(sql, mid = managerId, fn = firstName)

 

# Loop over the result set

for row in cursor:

    print(row)

 

与数据库的简单连接需要用户名、密码和连接字符串。找到您的 Oracle 数据库用户名和密码以及数据库连接字符串,并在 query.py 中使用它们。

cursor 游标是允许执行语句和获取结果的对象。

:mid 及 :fn 是用到了 sql 的绑定变量,这将语句文本与数据分离,有助于避免 SQL 注入安全风险。

我们运行这个脚本,可得:

D:\dba>python query.py

('Peter',   'cat')

 

连接到 Oracle 数据库

建立数据库连接

使用 cx_Oracle 连接到 Oracle 数据库有两种方法:

独立连接

当应用程序维护到数据库的单个用户会话时。连接是由 cx_Oracle.connect ()或其别名 cx_Oracle.Connection ()创建的。

池连接

当应用程序频繁地连接和断开与数据库的连接时,连接池对于性能非常重要。池实现中的 Oracle 高可用性功能意味着,对于那些希望少数连接可供不经常使用的应用程序,小池也很有用。使用 cx_Oracle.SessionPool ()创建池,然后可以调用 SessionPool.acquire ()从池获取连接。

 

示例:与 Oracle 数据库的独立连接

import cx_Oracle

 

userpwd = ". . ." # Obtain password string   from a user prompt or environment variable

 

connection = cx_Oracle.connect("hr",   userpwd, "dbhost.example.com/orclpdb1", encoding="UTF-8")

 

 

当调用 Connection.close ()不再需要连接时,应释放连接。其中一种方法是使用“ with ”块,它可以确保连接在块完成后关闭。例如:

with cx_Oracle.connect(userName, password,   "dbhost.example.com/orclpdb1",

              encoding="UTF-8") as connection:

    cursor = connection.cursor()

    cursor.execute("insert into   SomeTable values (:1, :2)",

              (1, "Some string"))

    connection.commit()

 

此代码确保块完成后,连接将关闭,数据库将回收资源。此外,任何试图在块外使用变量连接的尝试都将失败。

特权连接

下面的示例演示如何以 SYSDBA 身份连接到 Oracle 数据库:

connection = cx_Oracle.connect("sys",   syspwd, "dbhost.example.com/orclpdb1",

          mode=cx_Oracle.SYSDBA, encoding="UTF-8")

 

cursor = con.cursor()

sql = "GRANT SYSOPER TO hr"

cursor.execute(sql)

SQL 执行

执行 SQL 语句是 Python 应用程序与 Oracle 数据库通信的主要方式。语句使用 Cursor.execute ()或 Cursor.executemany ()方法执行。语句包括查询、数据操作语言( DML )和数据定义语言( DDL )。还可以执行其他一些特殊语句。

cx_Oracle 可用于执行单个语句,一次执行一个,不支持 sql 文件,如果需要的话,官方提供一个执行 sql 文件的函数,可以调用该函数实现执行 sql 文件的需求。 https://github.com/oracle/python-cx_Oracle/blob/master/samples/SampleEnv.py

SQL 语句不应包含尾随分号(“;”)或正斜杠(“ / ”)

cur.execute("select * from MyTable")

SQL 查询

 

查询(以 SELECT 或 with 开头的语句)只能使用 Cursor.execute ()方法执行。然后可以迭代行,或者使用 Cursor.fetchone ()、 Cursor.fetchmany ()或 Cursor.fetchall ()方法之一获取行。

Fetch Methods

Cursor.fetchone() :

cur = connection.cursor()

cur.execute("select * from MyTable")

while True:

    row = cur.fetchone()

    if row is None:

        break

    print(row)

 

Cursor.fetchmany() :

cur = connection.cursor()

cur.execute("select * from MyTable")

numRows = 10

while True:

    rows = cur.fetchmany(numRows)

    if not rows:

        break

    for row in rows:

          print(row)

 

cur.fetchall()

cur = connection.cursor()

cur.execute("select * from MyTable")

rows = cur.fetchall()

for row in rows:

    print(row)

 

 


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69993859/viewspace-2752596/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论
数据库DBA

注册时间:2021-01-25

  • 博文量
    13
  • 访问量
    19266