web自动化测试第27步:连接数据库(mysql的ssh和明文连接)

在某些场景,我们需要通过从数据库取值来进行赋值、比对断言,所以就需要连接数据库的方法,这里着重介绍一下关于如何使用python连接mysql数据库,其中包括账号密码连接mysql和ssh连接mysql,以及账号密码连接 oracle数据库。

一、账号密码连接mysql的步骤

1. 导入库

python连接mysql需要导入:pymysql库

我们直接导入:import pymysql.cursors

2.连接数据库

这里通过Connect方法连接数据库,这里要传递数据库配置。

host:数据库地址

port:数据库端口号

user:用户名

passwd:用户登录密码

db:数据库名称

charset:数据库数据编码

    connect = pymysql.Connect(
        host="localhost",
        port=3306,
        user="root",
        passwd="Aa123454562",
        db="test",
        charset="utf8"
    )

3.获取游标

cursor = connect.cursor(cursor=pymysql.cursors.DictCursor)

4.执行sql语句并且获取执行结果

# 执行sql语句
cursor.execute("这里写sql语句")
connect.commit()
# 获取所有记录列表
results = cursor.fetchall()

 

5.关闭连接

查询完毕结果后,关闭游标和数据库的连接。

    cursor.close()
    connect.close()

最终版本:

这里我对返回数据进行了处理,当返回数据为多个时,每个数据作为列表的一个值。

返回结果格式示例:

[{'name':'张三','age':'23'}, {'name':'李四','age':'23'}]

import pymysql.cursors
import copy


def run_mysql(sql_words):
    """
        运行sql语句
        :param
        sql_words: sql语句
        :return: 查询数据对应的字典列表
    """
    connect = pymysql.Connect(
        host="localhost",
        port=3306,
        user="root",
        passwd="",
        db="cenpur",
        charset="utf8"
    )
    # 获取游标
    cursor = connect.cursor(cursor=pymysql.cursors.DictCursor)
    # 定义返回结果列表
    sql_list = []
    try:
        # 执行SQL语句
        cursor.execute(sql_words)
        connect.commit()
        # 获取所有记录列表
        results = cursor.fetchall()
        # 结果格式处理
        for i in results:
            sql_list.append(copy.deepcopy(i))
    except:
        print("Error: 无法获取数据库数据")
    # 关闭连接
    cursor.close()
    connect.close()
    return sql_list

二、通过ssh连接mysql数据库

有些数据库设置了ssh加密,也就是要使用密钥ssh方式才能连接,在网上搜索了很久后,找到了使用ssh连接mysql的方法。

这里使用paramiko库。

1.导入库

import paramiko

2.设置ssh文件信息

这里通过密钥文件路径读取文件

private_key = paramiko.RSAKey.from_private_key_file("D:\ssh\rsa")

3.创建ssh对象

ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

4.通过ssh连接服务器,并执行sql语句

执行sql的命令中,除了需要mysql的账号、密码、密钥之外,还需要在command方法下,使用linux下的mysql命令来运行我们的sql语句

在linux下运行sql语句:

mysql -h主机ip -P主机端口 -u主机账户名 -p主机密码 -e'sql语句' 数据库名

commad_words = "mysql -h主机ip -P主机端口 -u主机账户名 -p主机密码 -e'sql语句' 数据库名" 

ssh.connect(hostname='172.16.2.30', port=22, username='dev', pkey=private_key)
stdin, stdout, stderr = ssh.exec_command(commad_words )

5.读取sql语句运行结果

# 创建结果列表

sql_results = []

装载sql数据

 for std in stdout:
        sql_results.append(std.strip())

最终版本:

结果读取有一个问题,那就是返回的格式会是:

["name age", "张三 23", "李四 24"]

这样的话读取有些困难,所以我又写了一个方法用来转格式为:

[{'name':'张三','age':'23'}, {'name':'李四','age':'24'}]

import paramiko


def run_mysql(sql_words):
    """
    运行sql语句
    :param sql_words: sql语句
    :return: 查询数据对应的字典列表
    """
    loadpath = "D://config//id_rsa_30"
    sql_results = []
    private_key = paramiko.RSAKey.from_private_key_file(loadpath)
    # 创建SSH对象

    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接服务器
    ssh.connect(hostname='localhost', port=22, username='dev', pkey=private_key)
    stdin, stdout, stderr = ssh.exec_command(
        "mysql -h主机ip -P主机端口 -u主机账户名 -p主机密码 -e'%s' 数据库名"  % sql_words)
    # 结果存储
    for std in stdout:
        sql_results.append(std.strip())
    sql_dic = listToDic(sql_results)
    return sql_dic

def listToDic(lists):
    """
    将sql列表转换为字典
    :param lists: 空格分割
    :return: 字典信息的列表
    """
    title_list = lists[0].split("\t")
    hang = len(lists)
    sql_list = []
    for x in range(1, hang):
        app = {}
        lie_msg = lists[x].split("\t")
        if lie_msg:
            for i in range(len(lie_msg)):
                app[title_list[i]] = lie_msg[i]
            sql_list.append(copy.deepcopy(app))
    return sql_list

这就是两种不同的方法连接mysql数据库。

三、连接oracle数据库

虽然我没有实际测试oracle数据库连接,但是大致的方法都一样,这里也介绍一下。(由于本地没有装oracle,所以不能保证代码一定正确)

1.导入库

导入cx_Oracle库:

import cx_Oracle

2.配置并连接数据库

# 配置数据库信息
connect_config = 用户名 + '/' + 密码 + '@(DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=' + host地址 + ')(PORT=' + 端口port + '))(' 'CONNECT_DATA= (SID=' + 数据库名 + '))) '
# 连接数据库
oracle = cx_Oracle.connect(connect_config, encoding="UTF-8", nencoding="UTF-8")
# 获取游标
cur = oracle.cursor()

3.运行sql语句,并且获取结果

# 运行sql语句
cur.execute(sql语句)
oracle.commit()
# 获取结果
result = cur.fetchall()

最终版本:

这里最终版,仍旧是对返回的数据进行了格式处理。

import cx_Oracle


def connect_oracle():
    # 配置数据库信息
    connect_config = 用户名 + '/' + 密码 + '@(DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=' + host地址 + ')(PORT=' + 端口port + '))(' 'CONNECT_DATA= (SID=' + 数据库名 + '))) '
    # 连接数据库
    oracle = cx_Oracle.connect(connect_config, encoding="UTF-8", nencoding="UTF-8")
    # 获取游标
    cur = oracle.cursor()
    # 运行sql语句
    cur.execute(sql语句)
    oracle.commit()
    result = makedict(cur)
    return result


def makedict(cursor):
    dictresult = []
    result = cursor.fetchall()
    cur_desc = cursor.description  
    # cursor.description方法会将每个字段的字段名,字段类型,字段长度...等等字段的属性列出来.
    if result:
        for rowindex in range(result.__len__):
            rowresult = {}
            for colomnindex in range(cur_desc.__len__):
                field_name = cur_desc[colomnindex][0]
                cellvalue = result[rowindex][colomnindex]
                rowresult[field_name] = cellvalue
            dictresult.append(rowresult)
    return dictresult

 

 

 

 

 

 

 

 

你可能感兴趣的:(web自动化测试)