在某些场景,我们需要通过从数据库取值来进行赋值、比对断言,所以就需要连接数据库的方法,这里着重介绍一下关于如何使用python连接mysql数据库,其中包括账号密码连接mysql和ssh连接mysql,以及账号密码连接 oracle数据库。
python连接mysql需要导入:pymysql库
我们直接导入:import pymysql.cursors
这里通过Connect方法连接数据库,这里要传递数据库配置。
host:数据库地址
port:数据库端口号
user:用户名
passwd:用户登录密码
db:数据库名称
charset:数据库数据编码
connect = pymysql.Connect(
host="localhost",
port=3306,
user="root",
passwd="Aa123454562",
db="test",
charset="utf8"
)
cursor = connect.cursor(cursor=pymysql.cursors.DictCursor)
# 执行sql语句
cursor.execute("这里写sql语句")
connect.commit()
# 获取所有记录列表
results = cursor.fetchall()
查询完毕结果后,关闭游标和数据库的连接。
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加密,也就是要使用密钥ssh方式才能连接,在网上搜索了很久后,找到了使用ssh连接mysql的方法。
这里使用paramiko库。
import paramiko
这里通过密钥文件路径读取文件
private_key = paramiko.RSAKey.from_private_key_file("D:\ssh\rsa")
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
执行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 )
# 创建结果列表
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,所以不能保证代码一定正确)
导入cx_Oracle库:
import cx_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 = 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