python API自动化(Jsonpath断言、接口关联及加密处理)

JsonPath应用及断言 重要

        自动化要解决的核心问题 :进行自动测试-自动校验(进行结果的校验

  1. 主要能够通过这个方式提取数据
  2. 业务场景:断言 、接口关联

{key:value}网址:附:在线解析 JSONPath解析器 - 一个工具箱 - 好用的在线工具都在这里!

json的基本应用:\

        

格式: $路径基础的应用【必须掌握的】
# 1. $.key 
$.name
# 2. $..key --- 从任意的目录去找
$.name列表:可以通过下标去进行获取:从0开始
$.hobbies[2]$..year  --- 所有的年语法:
$.key[?(@.key==year)]区间:左闭右开(后面的下标需要+1)
$.projects[0:1]# 获取根目录下的子字段:获取用户名
$.name
# 获取根目录下的字典中的数据:获取地址中的城市("country": "USA")
$.address.country
# 获取根目录下的列表中的某个数据:获取教育经历
$.education[0]
# 获取根目录下的列表中的所有数据中的某个字段:获取教育经历中的年
$.education[0:].year
# 获取根目录下的列表中满足某个条件的数据:获取教育经历中的年等于2020 的数据,== \!=
$.education[?(@.year==2020)]
# 获取所有的数据
$.*

我们把数据放入pycharm中,在里面编写json代码

        

#  返回的数据类型都是列表格式【重点】
res = jsonpath.jsonpath(data, "$..year")
print(res)
print(type(res))res = jsonpath.jsonpath(data, "$.name")
print(res)  # 列表
print(res[0])  # 下标获取某个值
print(type(res))

代码示例如下

import jsonimport requests
import jsonpath# 案例:登录接口 :
# 接口请求的四要素:URL\ 请求方法 \请求参数\响应数据
#  URL
url = "http://shop-xo.hctestedu.com/index.php?s=/api/user/login"
# 请求参数-- 公共参数-- url
pulic_data = {"application": "app", "application_client_type": "weixin"}
# 请求参数-- body (你的body数据是要以json进行提交,参数:json)
data = {"accounts": "hami", "pwd": "123456", "type": "username"}
# 请求头
header = {'Content-Type': 'application/json; charset=utf-8'}
#  请求头是json,所以数据类型需要转
json_data = json.dumps(data)# --------------------发送接口请求---------------------------
res = requests.post(url, params=pulic_data, headers=header,data=json_data) # 正确的演示# --------------------获取响应数据---------------------------
print(res.json())
# print("响应的数据类型:", res.headers)# --------------------获取数据进行断言处理---------------------------
#  失败案例
exData = "登录成功"
# SjData = jsonpath.jsonpath(res.json(),"$.msg")   #  错误的案例
SjData = jsonpath.jsonpath(res.json(),"$.msg")[0]
# print(SjData)
assert exData == SjData, "期望结构是:{0},实际结果是:{1}".format(exData, SjData)

示例2:

        

import requests
import jsonpath
import json
# 案例一:
url = "http://shop-xo.hctestedu.com/index.php?s=/api/user/login"
public_data = {"application": "app", "application_client_type": "weixin"}
data = {"accounts": "hami", "pwd": "123456", "type": "username"}
res = requests.post(url=url, params=public_data, data=data)
# ----------------------------------------
# 获取响应数据
result1 = res.json() # 以字典的格式获取
result2 = res.text # 以文本的格式获取
print(type(result1)) # 字典 <class 'dict'>
print(type(result2)) # 字符串 <class 'str'>
# 实际结果
# 字典格式:直接获取数据
# reality_res= jsonpath.jsonpath(result1, "$.msg")
# 字符串格式:先通过.loads()进行转换
dict_data = json.loads(result2)
reality_res = jsonpath.jsonpath(dict_data, "$.msg")
# 期望结果
desire_res = "登录成功"
# 断言:期望结果 == 实际结果
# assert desire_res == reality_res # 是一个列表需要通过下标获取具体的值
assert desire_res == reality_res[0]
print(reality_res)

接口关联 重要(上一个接口的响应数据作为下一个请求数据)

接口关联是在进行接口测试时,将一个接口的返回结果中的某些数据提取出来,然后作为后续接口请求的参数或者验证的依据。通过接口关联,可以实现接口间的数据传递和依赖关系的建立
接口关联通常分为两种类型:请求关联和响应关联

1. 请求关联:

提取关键参数:在一个接口的请求中,某些参数的值是由之前接口的响应结果提供的。需要提取出这些关键参数,并将其作为后续接口的请求参数。

例如,一个接口的请求中需要使用到某个用户的登录令牌(token),可以通过在登录接口的响应结果中提取出令牌(token),然后在后续接口的请求中使用

2. 响应关联:

验证关键数据:在一个接口的响应结果中,某些数据是需要验证的,可以将这些数据提取出来,并进行断言或者其他验证操作。

例如,一个接口的响应结果中包含了某个订单的状态信息,可以将该状态信息提取出来,然后进行断言,验证订单是否处于正确的状态

1. 首先登录成功--提取token

2. 通过用户去进行加入购物车。--- token值取进行指定

在线美化json地址:JSON在线解析及格式化验证 - JSON.cn

案例:通过登录的用户把登录的用户加入购物车

                

import requests
import jsonpath
# 案例一:登录接口
url = "http://shop-xo.hctestedu.com/index.php?s=/api/user/login"
public_data = {"application": "app", "application_client_type": "weixin"}
data = {"accounts": "hami", "pwd": "123456", "type": "username"}
res = requests.post(url=url, params=public_data, data=data)
# ----------------------------------------
# 获取响应数据
result = res.json()
print(f"响应结果是:{result}")
# 期望结果
desire_res = "登录成功"
# 实际结果
reality_res = jsonpath.jsonpath(result, "$.msg")
# 断言:期望结果 == 实际结果
# assert desire_res == reality_res # 是一个列表需要通过下标获取具体的值
token = jsonpath.jsonpath(result, "$.data.token")
print(f"获取到的token值为:{token}")
assert desire_res == reality_res[0]
# 案例二:加入购物车
url = "http://shop-xo.hctestedu.com/index.php?s=/api/cart/save"
# public_data = {"application": "app", "application_client_type": "weixin", "token":
"8ae1ce79ed621a991a5e53ba9f96bfd3"}
public_data = {"application": "app", "application_client_type": "weixin", "token": token}
data = {
"goods_id": "11",
"spec": [
{
"type": "尺寸",
"value": "M"
}
],
"stock": "10"
} r
es = requests.post(url=url, params=public_data, data=data)
print(f"请求的url是:{res.url}")
# 获取响应数据
result = res.json()
print(f"响应结果是:{result}")
# 期望结果
desire_res = "加入成功"
# 实际结果
reality_res = jsonpath.jsonpath(result, "$.msg")
assert desire_res == reality_res[0]

对称加密与非对称加密

        

  我们使用加密目的是提高数据的安全性

        提高安全性的方法如下:     

  1. 在对应的协议加认证证书: http请求 --- https请求 (花钱去买一个安全)
  2. 通过一些常用的算法去进行解决: MDH\ SHA\ 编码:BASE64
  3. 通过对应加密方式去进行加密:对称加密 、非对称加密

               

                对称加密:

在对称加密算法中,加密和解密使用的是同一把钥匙,即:使用相同的密匙对                 同一密码进行加密和解密

               加密过程如下:

                加密:原文 + 密匙 = 密文

                解密:密文 - 密匙 = 原文

                对称加密代码如下:

                

"""
对称加密:加密和解密使用的是同一把钥匙,即:使用相同的密匙对同一密码进行加密和解密。
常用的加密方法:DES、3DES、AES...(AES算法是目前最常用的对称加密算法)
"""
import base64
from Crypto.Cipher import AESclass EncryptDate:# 构造方法def __init__(self, key):#  类属性self.key = key.encode("utf-8")  # 初始化密钥self.length = AES.block_size  # 初始化数据块大小 :16位self.aes = AES.new(self.key, AES.MODE_ECB)  # 初始化AES,ECB模式的实例# 截断函数,去除填充的字符self.unpad = lambda date: date[0:-ord(date[-1])]# 缺几位数据就补齐多少位数据:16的倍数def pad(self, text):  # text == tony"""#填充函数,使被加密数据的字节码长度是block_size的整数倍"""count = len(text.encode('utf-8'))  # count = 4add = self.length - (count % self.length)   # 求它们相差的位数# add = 16- (4%16)  === 16 - 4 == 12entext = text + (chr(add) * add)#  entext = “tony” + (chr(add) * 12  )  === entext == tony# print("entext的数据是:",entext)return entext# 加密函数def encrypt(self, encrData):  # 加密函数   encrData == tony (16位)res = self.aes.encrypt(self.pad(encrData).encode("utf8"))  # self.aes.encrypt(tony)msg = str(base64.b64encode(res), encoding="utf8")return msg# 解密函数def decrypt(self, decrData):  # 解密函数   XbXHJrNLwoTVcyfqM9eTgQ==# 从base64编码转回来res = base64.decodebytes(decrData.encode("utf8"))# 将数据进行对应的解密:XbXHJrNLwoTVcyfqM9eTgQ==msg = self.aes.decrypt(res).decode("utf8")# print("msg的值:",msg)# 把转回来的数据后面的字符去掉。return self.unpad(msg)def fun1():
#     通过方法把这个接口请求通passif __name__ == '__main__':#  加密 :会补位key = "1234567812345678"  # key 密码data = "tony"  # 数据eg = EncryptDate(key)  # 这里密钥的长度必须是16的倍数,并且设置对应的【模式】res = eg.encrypt(str(data))print(f"加密后的数据为:{res}")#  解密 : 把后面的数据进行去除key = "1234567812345678"  # key 密码data = "XbXHJrNLwoTVcyfqM9eTgQ=="  # 数据eg = EncryptDate(key)  # 这里密钥的长度必须是16的倍数res = eg.decrypt(str(data))print(f"解密后的数据为:{res}")

                

                

                非对称加密:

        明白了对称加密后,我们来了解一下什么是非对称加密。我们知道,对称加密是使用的同一把密匙进行加密和解密。那么,非对称加密自然是使用 不同的密钥进行加密和解密 啦。

        非对称加密有两个钥匙,及公钥(Public Key)和私钥(Private Key)。公钥和私钥是成对的存在,如果对 原文 使用 公钥加密 ,则只能使用 对应的私钥 才能 解密 ;因为加密和解密使用的不是同一把密钥,所以这种算法称之为非对称加密算法。

非对称加密算法的密匙是通过一系列算法获取到的一长串随机数,通常随机数的长度越长,加密信息越安全。通过私钥经过一系列算法是可以推导出公钥的,也就是说,公钥是基于私钥而存在的。但是无法通过公钥反向推倒出私钥,这个过程是单向的

代码如下

        

# -*- coding: utf-8 -*-
import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as PKCS1_cipher# 注意开头
# PKCS1是BEGIN RSA PUBLIC KEY
# PKCS8是BEGIN PUBLIC KEY"""
PKCS8 案例"""
# 公钥
pub_str1 = '''-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgFAOoAvLNvQv8BNGQq7B
m8ifMIUaYnFIC2Vu3ahW98zu/0Bg2GFAiIShOlNZcP8dGVLX6J4+p3k6pFRhloWJ
nviJUVU1xdZGjnk6snARB2V+8u73o5HQqn7ISgipjIb8pQc9wCZNBBT5eOB83K44
5Md0slkgz05jQ9Cj4UcIHUWquwGNQYo3zy9DOqDJaWimu46O1HnZAWrADsBfURPB
p9cqqmnxYMejqkBbj9JWhw+3YLpB9sLMQib0p7MEGA8GrpG+cXGYxdI0f0ZfJqEt
TpuJHNdSZwN7oZiBhJlL+tHOIRcq2dFCKUMYgrW9XK8cJVJVYxU7R1e2ZURXSmP3
yQIDAQAB
-----END PUBLIC KEY-----'''# 私钥
priv_str1 = '''-----BEGIN RSA PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCAUA6gC8s29C/w
E0ZCrsGbyJ8whRpicUgLZW7dqFb3zO7/QGDYYUCIhKE6U1lw/x0ZUtfonj6neTqk
VGGWhYme+IlRVTXF1kaOeTqycBEHZX7y7vejkdCqfshKCKmMhvylBz3AJk0EFPl4
4Hzcrjjkx3SyWSDPTmND0KPhRwgdRaq7AY1BijfPL0M6oMlpaKa7jo7UedkBasAO
wF9RE8Gn1yqqafFgx6OqQFuP0laHD7dgukH2wsxCJvSnswQYDwaukb5xcZjF0jR/
Rl8moS1Om4kc11JnA3uhmIGEmUv60c4hFyrZ0UIpQxiCtb1crxwlUlVjFTtHV7Zl
RFdKY/fJAgMBAAECggEALex5T47pDKIZBjPf0b36TWdgkl0RNGqW/n0vUOYPOmF+
qJzCDK/CCRpvGhD60hZ8s7OS0w7QHeClvGr3AoiI2PzbKOD2ffhTCGsbNwIlFiCd
bxVYTJLDvEHkLZssE7+8bNRKpZsPtYZMQ5cVGWbBtiAtBCgiNhA4Nu1VuitSHCdw
cpHrFCA7ESDmfmRGe7QAnTEkC2nUoM/9xPIBV4B1Lz3/KJuY+zJZWXkw1m64rC55
9cPILlc9zTrKYw0JSyC0PGXQSOZZ71TyEicsptVLIM2NT2ppdyu57i3IcVoFXyV6
XVoEWEFOXSppxkWXVXlYfJRT/rb1bEjzSCBWYKYGgQKBgQDLzcF1S/CMIlAW6LDY
vO0uoPOuMZE3yUUMASKrF2M0IuTZxO2Z/DSwwr3bt7X/r32sDceiVGAAj735VToh
ERhHOtgbP1s4S/rytHHMpAfEKciCcC8eNHvO4Q/N4W94B0uaUufamWRsgQog1F5F
12ymeuas0HApHTtEdohw1kR9uwKBgQChLMm5PyskU4ID0Jjse6XEwE4HcNCH9Qp6
MtBGznNLsGS2dLw8meKz6Q28ytgSGHPxFYEjzVmVKkiXzz95o6r3tn8so7IcfB+J
T55zn5DVK4o6ZYAeLWjBEzjTbbOIloFiOYgBHy9LXvV8kCN0bmBXvX1KEU2J6/Zh
rkIHRbZGSwKBgE0f+0MJTumpHofc3PfYXyWTMURNa7ghyahmUZlPi3IydkpW9Nee
Es6Fk9WvKwesgLF4sYCjz4TG4MyXTR0wW/CwuxFso3elgT0RvjMELBA3A7MhAyO6
FtROZW2zDzzr/ddT4nveKpvJJW0REO/7OxmxTtQ9OQTGFCSveqjA3UB7AoGBAJ4j
QbGehwfXX6O6kbDGCPmo7WZjjFc5WBRZsv0mJv3GjqpukxqqqkJ3keEA7Uuj7m5G
+TRVkWXH3P4GfHMu4Nq3lsQHwQQtzQt+sSslDof5dmChojj5uORnpcPcyOBlO4FS
jVz8afz7qMWU7xSYD7NG2p1HqNqASHfC8EoOXi9NAoGAZT5ezE1bTpIo40wArVJG
TA4R59m9RugGIFQl2Tpqw9ACUTjVNBkNtCpLEYV9Fznwy1PxE2OW5zGgpwWPm63D
D4tH1xShy5jOm7MIF7afrYgPbIYXyIdFtXY7sJuLETD2sYFBHG5ocZ4Pto/ELV7g
iK3ec+5UKwA/TN7l7Q7NE9A=
-----END RSA PRIVATE KEY-----
'''class Rsa:# 自动调用我们构造方法加载对应的公钥和私钥def __init__(self):# 加载公钥self.pub_key = RSA.importKey(pub_str1)# 加载私钥self.pri_Key = RSA.importKey(priv_str1)# rsa加密,返回加密结果def encrypt(self, text):# 1. 创建一个加密器对象 cipher,使用 self.pub_key 作为公钥cipher = PKCS1_cipher.new(self.pub_key)# 2. 加密:将text.encode("utf-8)" 转为b64编码rsa_text = base64.b64encode(cipher.encrypt(text.encode("utf-8)")))# 3. 解码为字符串text = rsa_text.decode("utf8")return text# rsa解密 返回解密结果def decrypt(self, text):# 1. 创建一个加密器对象 cipher,使用self.pri_Key作为公钥cipher = PKCS1_cipher.new(self.pri_Key)# 2. 解密:将密文数据 text 转换为 UTF-8 编码的字节序列,# 然后使用cipher对象调用decrypt()方法进行解密。# 解密前,还需要对密文进行 Base64 解码,得到原始的加密结果。# 第二个参数 0 表示不使用任何的填充方式rsa_text = cipher.decrypt(base64.b64decode(text.encode("utf8")), 0)# 解码为字符串text = rsa_text.decode("utf8")return textif __name__ == "__main__":# 1. 实例化对象rsaer = Rsa()# 2. 进行加密处理info = rsaer.encrypt('哈米')print('加密:', info)# 3. 进行解密处理print('解密:', rsaer.decrypt(info))


     

                

                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/847218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年【N2观光车和观光列车司机】考试报名及N2观光车和观光列车司机最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 N2观光车和观光列车司机考试报名考前必练&#xff01;安全生产模拟考试一点通每个月更新N2观光车和观光列车司机最新解析题目及答案&#xff01;多做几遍&#xff0c;其实通过N2观光车和观光列车司机很简单。 1、【多…

使用system verilog进行流水灯和VGA打印字符

使用system verilog进行流水灯和VGA打印字符 目录 **使用system verilog进行流水灯和VGA打印字符****system verilog的优点****VGA程序编写**VGA 控制器模块字符生成模块顶层模块测试基准程序**效果** **流水灯程序设计****效果** **总结** system verilog的优点 面向对象编程…

618购物狂欢,好物榜单揭晓!一文了解那些值得入手的数码产品

随着618购物狂欢节的脚步渐近&#xff0c;想必各位消费者已经开始规划自己的购物清单了。毕竟&#xff0c;这样的年度大促是难得的省钱良机&#xff0c;许多平日里心仪已久的大牌商品和高价宝贝都在等待着这一天的优惠。错过了618&#xff0c;恐怕又要等上半年才能遇到如此诱人…

如何制作不限扫描次数的视频二维码?1分钟教程

不可否认的是&#xff0c;视频二维码正在各行各业发挥重要作用。不论是在线上宣传、线下活动&#xff0c;还是产品包装、展览展会上&#xff0c;只需要扫描视频二维码&#xff0c;就能在手机端获得专业的视频教程、查看品牌宣传视频、了解活动流程、快速获取关键信息等&#xf…

图形学初识--深度测试

文章目录 前言正文为什么要有深度测试&#xff1f;画家算法循环遮挡 深度测试当代最常见实现方式&#xff1f;总述什么是z-buffer呢&#xff1f;z-buffer从哪来呢&#xff1f;如何利用z-buffer实现深度测试&#xff1f;举个例子 结尾&#xff1a;喜欢的小伙伴点点关注赞哦! 前言…

【计算机毕设】基于SpringBoot的图书进销存管理系统设计与实现 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 本研究旨在设计并实现一款基于SpringBoot的图书进销存管理系统&#xff0c;旨在解决图书馆或书店在图书采购、销售和库存管理等方面的问题&#xff…

新手开视频号小店需要做什么准备?只需做好这几个准备,缺一不可

大家好&#xff0c;我是电商花花。 现在视频号小店发展的这么红火&#xff0c;很多人开始在视频号上开始开店&#xff0c;做电商。 目前视频号小店随着流量的市场的保证&#xff0c;不少商家也想通过视频号小店来进行变现。 但是&#xff0c;我们作为一个新手&#xff0c;想…

APP 备案步骤

一、打开阿里云备案系统平台&#xff1a;aliyunbaike.com/go/beian 二、开始备案 三、填写APP名称并进行信息校验 四、填写主办者基础信息和主办者负责人信息 五、填写互联网信息,android打包的APK包可直接上传识别信息&#xff0c;ios需要手动填写信息 公钥和证书SHA-1指纹如…

图片怎么批量转二维码?快速导出批量图片活码的方法

怎么将多张图片快速批量生成二维码&#xff1f;现在用二维码来展示图片在很多的场景下都有应用&#xff0c;这种方式可以有利于用户快速扫码获取内容&#xff0c;提升便利性的同时也可以降低制作者的成本&#xff0c;提供更好的用户体验。有些时候我们需要针对不同的场景或者物…

江苏大信环境科技有限公司:环保领域的开拓者与引领者

2009 年&#xff0c;江苏大信环境科技有限公司在宜兴环保科技工业园成立。自创立之始&#xff0c;该公司便笃定坚守“诚信为本、以质量求生存、以创新谋发展”这一经营理念&#xff0c;全力以赴为客户构建专业的工业有机废气治理整体解决方案&#xff0c;进而成为国家高新技术企…

Streamsets-JDBC模式offset变化逻辑和如何向下传递offset

Streamsets的版本为3.16.0 离线版 offset在jdbc模式中起到非常关键的作用&#xff0c;是滚动查询的基础&#xff0c;offset的准确直接影响数据同步的质量。 本文主要分享一下JDBC Query Consumer中的offset&#xff0c;包括变化逻辑、存储方式、处理器如何获取到最新的offset。…

coze扣子自定义插件使用方式1

1&#xff0c;模型中的工具描述 2&#xff0c;大模型调用&#xff0c;触发接口&#xff1a;

Outlook 邮箱使用技巧

良好时间管理的基本原则 Outlook 是帮你管理电子邮件、日历、联系人和任务的工具。 因此&#xff0c;不论是在沟通还是在时间管理中&#xff0c;它都占据着中心位置。 为充分利用 Outlook&#xff0c;我们提出了一些基本原则&#xff1a; 减少阅读邮件的位置。 如果你使用的是…

机器学习的热门领域及应用趋势

机器学习的热门领域及应用趋势 近年来&#xff0c;机器学习&#xff08;Machine Learning, ML&#xff09;已经成为科技领域的热门话题&#xff0c;其在各个行业的应用越来越广泛和深入。本文将详细介绍当前机器学习的几个热门领域&#xff0c;以及人们在这些领域中使用的机器…

文件同步软件,PanguFlow局域网横着走

说到文件同步&#xff0c;它对企业来说及其重要&#xff0c;因为有了文件同步&#xff0c;这个文件数据它才能备份起来&#xff0c;才能用来抵抗自然灾害&#xff0c;比如服务器硬盘损坏了&#xff0c;你要是不备份&#xff0c;这损失可就大了&#xff0c;一款合适的文件同步软…

第二讲笔记:隐私计算助力数据要素流通

1、数据要素流转与数据 2、数据外循环中的信任 焦虑 信任焦虑背后的代表性案例 内鬼门 &#xff1a; 2023 年 &#xff0c; 美国科技公司 Ubiquiti在2021年1月曝出数据泄露事 件&#xff0c; “攻击者”在随后的“谈判”中试 图向该企业勒索近200万美元&#xff08;50比特 币&…

javacv ffmpeg使用笔记 (补充中...)

javacv ffmpeg使用笔记 一、maven依赖二、示例代码1. 获取视频时长 三、小技巧 一、maven依赖 使用javacv ffmpeg并指定classifier之后&#xff0c;就不需要额外安装ffmpeg软件&#xff08;jar包中已经内置&#xff09;了。 全量依赖包&#xff08;不推荐&#xff09;安装包总大…

PCIe的链路状态

目录 概述 链路训练的目的 两个概念 下面介绍LTSSM状态机 概述 PCie链路的初始化过程较为复杂&#xff0c;Pcie总线进行链路训练时&#xff0c;将初始化Pcie设备的物理层&#xff0c;发送接收模块和相关的链路状态信息&#xff0c;当链路训练成功结束后&#xff0c;PCIe链…

数据库 mysql 的彻底卸载

MySQL卸载步骤如下&#xff1a; &#xff08;1&#xff09;按 winr 快捷键&#xff0c;在弹出的窗口输入 services.msc&#xff0c;打开服务列表。 &#xff08;2&#xff09;在服务列表中&#xff0c; 找到 mysql 开头的所有服务&#xff0c; 右键停止&#xff0c;终止对应的…