使用Python管理数据库
 

       这篇文章的主题是如何使用Python语言管理数据库,简化日常运维中频繁的、重复度高的任务,为DBA们腾出更多时间来完成更重要的工作。文章本身只提供一种思路,写的不是很全面,主要起个抛砖引玉的作用。希望能通过此篇文章激发起大家学习python的兴趣。

       Python作为目前最流行的编程语言之一, 在人工智能、统计分析等领域都有着非常广泛的应用。这两年借助人工智能,流行程度甚至一度超越了java等老牌语言。Python的语法相当直观、简洁、易懂,没有过于复杂的结构,让你能够专注于具体功能的实现,而无需在语法或结构上面下太多功夫。所以Python的学习曲线还是较为平缓的,尤其入门阶段(有编程基础的同学估计花几个小时看一遍语法结构就能使用了;没基础的同学大概花个一周时间也就差不多了)。入门推荐《Python编程:从入门到实践》这本书,让你能够快速上手。

Python还拥有种类繁多的库,让你无需重复造轮子,利用已经实现的功能去构建你的Idea即可(当然,如果你能造出新的好轮子供他人使用,那成就感会更高)

Why Python

说了这么多,好像跟咱DBA没啥关系。其实不然, 上面说了,Python拥有非常强大的库,这其中也包含了能够与数据库进行交互的模块,利用这些模块,DBA们也可以很轻松的使用Python管理数据库。

可能有人会说, 为什么要使用Python呢,咱们通常使用的PL/SQL + SHELL 不就已经够用了吗?而且DBA又不是程序员,不学编程也没啥太大关系吧?PL/SQL + SHELL 确实可以满足目前的日常运维, 而且这也是绝大部分DBA们的选择。但是如果你想对数据进行进一步的分析,甚至以图表的形式展现出来的话,Python可能就能排上用场了。而且当你熟悉了以后,你会发现它有多么好用。

初识cx_Oracle

cx_Oraclepython下能够跟Oracle数据库进行交互的模块。通过cx_Oracle,我们可以连接到数据库,完成一些日常运维工作。

1.Python 安装

大部分的Linux系统默认就已经安装了Python,可以使用命令查看具体版本号:

dev@dev-VirtualBox:~$ python3 --version
Python 3.5.2
由于我使用的是Ubuntu 16.04python3已经预装好了。其他不同的发行版可能只会装python2,这时候就需要先安装python3,可以选择在官网上下载并安装

2.使用pip下载安装cx_oracle模块

pip 是负责下载、安装Python包的程序。

dev@dev-VirtualBox:~/PycharmProjects/Oracle/venv/bin$ pip3 install cx_Oracle
Collecting cx_Oracle
  Downloading cx_Oracle-6.1-cp35-cp35m-manylinux1_x86_64.whl (527kB)
    100% |████████████████████████████████| 532kB 25kB/s
Installing collected packages: cx-Oracle
Successfully installed cx-Oracle-6.1
详细安装步骤可参考官方安装手册

3.使用cx_Oracle 模块连接数据库

安装完成后,就可以使用了。

1) 连接数据库(使用SYSDBA权限)
# 导入cx_Oracle
import cx_Oracle
# 建立数据库连接
db_connection = cx_Oracle.connect('sys', 'oracle', 'test', cx_Oracle.SYSDBA)
# 查看数据库版本
print(db_connection.version)
#关闭游标
db_cursor.close()
其中,cx_Oracle中的connect函数返回一个连接对象,表示连接成功。参数依次为: 
usename: 用户名
password: 密码
tnsnames: TNS连接字符串
cx_Oracle.SYSDBA: 使用SYSDBA登录
然后打印该连接对象的version属性即可查询数据库版本。
 

进一步使用cx_Oracle

1.简单查询

import cx_Oracle


# 建立连接
db_connection = cx_Oracle.connect('sys', 'oracle', 'test', cx_Oracle.SYSDBA)
# 使用游标访问数据
db_cursor = db_connection.cursor()
db_cursor.execute("""
    select employee_id, first_name, last_name from hr.employees
    where employee_id > :eid""",
    eid = 200)
# 获取所有数据
print(db_cursor.fetchall())
# 关闭游标
db_cursor.close()
# 执行结果
[(201, 'Michael', 'Hartstein'), (202, 'Pat', 'Fay'), (203, 'Susan', 'Mavris'), (204, 'Hermann', 'Baer'), (205, 'Shelley', 'Higgins'), (206, 'William', 'Gietz')]

fetchall()以列表形式返回所有行(每行的数据存储在元组中),所以也可使用循环遍历访问。例如访问第一行中的值:

for element in db_cursor.fetchall()[0]:
    print(element)
# 执行结果
201
Michael
Hartstein

 

2.使用函数封装连接

大家可能发现了,每次在对数据库操作前都要先建立连接,都要先输入一大串代码,有点重复。确实是这样,但是如果使用函数对连接方式进行封装,你可能就能体会到使用编程语言的好处了,以后在需要使用的时候直接调用函数就行了。

# 创建连接函数
def conn_cursor(conn_dict):
    # 使用字典储存连接信息
    connection = cx_Oracle.connect(conn_dict['username'],
        conn_dict['passwd'],
        conn_dict['tns_name'],
        mode=conn_dict['mode'])
    # 返回游标
    return connection.cursor()
: 字典可看做是由一对一对的键值对组成的,语法如下:这里将整个建立连接的代码复制过来,并使用一个字典作为形参,用来传递用户名、密码、TNS连接字符串及mode连接方式,最后返回游标。    
conn_dict = { 'username': 'sys', 'password': 'oracle', tns_name: 'test', 'mode': 2 }
   关于mode参数,如果需要以sys用户连接,则将mode的值设置为2(或者'cx_Oracle.SYSDBA'),普通用户设置为0即可。
现在我们通过使用conn_cursor()函数访问数据库:
# 使用hr用户连接并查询dept表
conn_hr = {
    'username': 'hr',
    'passwd': 'oracle',
    'tns_name': 'test',
    'mode': 0
}
cur_hr = conn_cursor(conn_hr)
cur_hr.execute(
    "select * from employees where rownum < 10"
)
# 获取第一行数据
print(cur_hr.fetchone())
# 执行结果
(198, Donald, OConnell, DOCONNEL, 650.507.9833, 21-JUN-07, SH_CLERK, 2600, 124, 50)

3.
封装常用sql脚本

数据库中特定语句的格式基本都是相同的,根据上面的例子,我们可以把常用的sql脚本通过形参+字符串的方式组合成语句,封装到函数中,例如:

# 创建用户
def create_user(ora_cursor, user, password, default_tbs, profile='default'):
    ora_cursor.execute(
        "create user " + user + " identified by " + password + ' default tablespace ' + default_tbs + " profile " + profile
    )
    print("user " + user + " created succesfully!")
    ora_cursor.close()
创建用户

相关文章:

  • 2021-12-17
  • 2021-06-12
  • 2022-01-07
  • 2022-12-23
  • 2022-12-23
  • 2021-06-28
  • 2021-08-11
猜你喜欢
  • 2021-10-12
  • 2021-10-11
  • 2021-09-19
  • 2021-09-25
  • 2022-12-23
  • 2021-12-09
  • 2022-01-01
相关资源
相似解决方案