Ubuntu下QT操作Mysql数据库
本篇总结一下一下Ubuntu下QT操作Mysql数据库。
目录
1. 启动Mysql数据库服务器
2.查看QT支持的数据库驱动
3.连接数据库
4. 增加表和记录
5. 删除记录
6. 修改记录
7. 查询记录
8.完整代码和运行效果
常见错误总结:
(1) 数据库服务没启动报错信息
(2) 有QMYSQL驱动,连接数据缺失败
1. 启动Mysql数据库服务器
// 启动
sudo /etc/init.d/mysql start
// 重启
sudo /etc/init.d/mysql restart
// 关闭
sudo /etc/init.d/mysql stop
2.查看QT支持的数据库驱动
Qt SQL模块是Qt提供的一个访问数据库的接口,支持多种平台下使用不同类型的数据库,在这个过程中,数据库驱动起到了很大的作用,它负责与不同的数据库进行通信,有了数据库驱动,我们才能使用不同类型的数据库。
#include <QtSql/QSqlDatabase>// 查看支持的数据库驱动 qDebug() << QSqlDatabase::drivers();
3.连接数据库
QSqlDatabase db;
if(QSqlDatabase::contains("qt_sql_default_connection")) {db = QSqlDatabase::database("qt_sql_default_connection");
}
else {// 创建一个数据库连接,指定数据库驱动db = QSqlDatabase::addDatabase("QMYSQL");
}// 数据库连接需要设置的信息
db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑
db.setDatabaseName("TestDB");// 数据库名
db.setUserName("root");// 用户名
db.setPassword("mysql");// 密码
db.setPort(3306);// 端口号// 连接数据库
bool ok = db.open();if (ok) {qDebug() << "连接成功";
}
else {qDebug() << "连接失败";
}
4. 增加表和记录
// 实例化QSqlQuery,用于执行sql语句
QSqlQuery query(m_db);
// 创建一个表
query.exec("create table newUser (id int primary key, username varchar(20))");
QSqlQuery query(m_db);
query.exec("INSERT INTO newUser (id, username) VALUES (1, 'Hello')");int userid = 2;
QString &&name = "张三";
query.prepare("INSERT INTO newUser (id, username) VALUES (:id, :username)");
query.bindValue(":id", userid);
query.bindValue(":username", name);
query.exec();query.exec("INSERT INTO newUser (id, username) VALUES (3, 'Andy')");
query.exec("INSERT INTO newUser (id, username) VALUES (4, '李四')");
5. 删除记录
QSqlQuery query(m_db);
query.prepare("DELETE FROM newUser WHERE username=:username");
query.bindValue(":username", "张三");
query.exec();
6. 修改记录
QSqlQuery query(m_db);
query.prepare("update newUser set username=:username WHERE id=:id");
query.bindValue(":id", 1);
query.bindValue(":username", "World");
query.exec();
7. 查询记录
// 查询所有QString sql = "SELECT id, username FROM newUser" ; // 组装sql语句QSqlQuery query(m_db); // [1] 传入数据库连接query.exec(sql); // [2] 执行sql语句while (query.next()) { // [3] 遍历查询结果qDebug() << QString("Id: %1, Username: %2").arg(query.value("id").toInt()).arg(query.value("username").toString());}// 查询指定记录QString username = "李四";sql = "SELECT * FROM newUser WHERE username='" + username + "'";query.exec(sql); // [2] 执行sql语句while (query.next()) { // [3] 遍历查询结果qDebug() << QString("Id: %1, Username: %2").arg(query.value("id").toInt()).arg(query.value("username").toString());}// 绑定数据查询username = "张三";sql = "SELECT * FROM newUser WHERE username=:username";query.prepare(sql); // [2] 使用名称绑定的方式解析 SQL 语句query.bindValue(":username", username); // [3] 把占位符替换为传入的参数query.exec(); // [4] 执行数据库操作while (query.next()) { // [5] 遍历查询结果qDebug() << QString("Id: %1, Username: %2").arg(query.value("id").toInt()).arg(query.value("username").toString());}
8.完整代码和运行效果
qt_mysql.pro
#-------------------------------------------------
#
# Project created by QtCreator 2023-09-05T23:12:20
#
#-------------------------------------------------QT += core gui
QT += sqlgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = qt_mysql
TEMPLATE = app# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \mainwindow.cppHEADERS += \mainwindow.hFORMS += \mainwindow.ui
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QtSql/QSqlDatabase>
#include <QDebug>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();void on_pushButton_3_clicked();void on_pushButton_4_clicked();void on_pushButton_5_clicked();void on_pushButton_6_clicked();void on_pushButton_7_clicked();void on_pushButton_clear_table_clicked();private:void createConnectionByName(const QString &connectionName); //使用自定义 connectionName 创建连接QSqlDatabase getConnectionByName(const QString &connectionName); // 使用自定义 connectionName 获取连接private:Ui::MainWindow *ui;QSqlDatabase m_db;
};#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlQuery>/*
Qt SQL模块是Qt提供的一个访问数据库的接口,支持多种平台下使用不同类型的数据库,在这个过程中,
数据库驱动起到了很大的作用,它负责与不同的数据库进行通信,有了数据库驱动,我们才能使用不同类型的数据库。*/MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);// 创建名为 firstMysqlConnect 的数据库连接createConnectionByName("firstMysqlConnect");
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{// 查看支持的数据库驱动qDebug() << QSqlDatabase::drivers();
}//使用自定义 connectionName 创建连接
void MainWindow::createConnectionByName(const QString &connectionName){m_db = QSqlDatabase::addDatabase("QMYSQL", connectionName);// 数据库连接需要设置的信息m_db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑m_db.setDatabaseName("TestDB");// 数据库名m_db.setUserName("root");// 用户名m_db.setPassword("mysql");// 密码m_db.setPort(3306);// 端口号// 连接数据库判断bool ok = m_db.open();if (ok){qDebug() << "连接成功";} else {qDebug() << "连接失败";}}// 使用自定义 connectionName 获取连接
QSqlDatabase MainWindow::getConnectionByName(const QString &connectionName) {// 获取数据库连接return QSqlDatabase::database(connectionName);
}void MainWindow::on_pushButton_2_clicked()
{QSqlDatabase db;if(QSqlDatabase::contains("qt_sql_default_connection")) {db = QSqlDatabase::database("qt_sql_default_connection");}else {// 创建一个数据库连接,指定数据库驱动db = QSqlDatabase::addDatabase("QMYSQL");}// 数据库连接需要设置的信息db.setHostName("127.0.0.1"); // 数据库服务器IP,我用的是本地电脑db.setDatabaseName("TestDB");// 数据库名db.setUserName("root");// 用户名db.setPassword("mysql");// 密码db.setPort(3306);// 端口号// 连接数据库bool ok = db.open();if (ok) {qDebug() << "连接成功";}else {qDebug() << "连接失败";}
}void MainWindow::on_pushButton_3_clicked()
{// 实例化QSqlQuery,用于执行sql语句QSqlQuery query(m_db);// 创建一个表query.exec("create table newUser (id int primary key, username varchar(20))");
}void MainWindow::on_pushButton_4_clicked()
{QSqlQuery query(m_db);query.exec("INSERT INTO newUser (id, username) VALUES (1, 'Hello')");int userid = 2;QString &&name = "张三";query.prepare("INSERT INTO newUser (id, username) VALUES (:id, :username)");query.bindValue(":id", userid);query.bindValue(":username", name);query.exec();query.exec("INSERT INTO newUser (id, username) VALUES (3, 'Andy')");query.exec("INSERT INTO newUser (id, username) VALUES (4, '李四')");
}void MainWindow::on_pushButton_5_clicked()
{QSqlQuery query(m_db);query.prepare("DELETE FROM newUser WHERE username=:username");query.bindValue(":username", "张三");query.exec();
}void MainWindow::on_pushButton_6_clicked()
{QSqlQuery query(m_db);query.prepare("update newUser set username=:username WHERE id=:id");query.bindValue(":id", 1);query.bindValue(":username", "World");query.exec();
}void MainWindow::on_pushButton_7_clicked()
{// 查询所有QString sql = "SELECT id, username FROM newUser" ; // 组装sql语句QSqlQuery query(m_db); // [1] 传入数据库连接query.exec(sql); // [2] 执行sql语句while (query.next()) { // [3] 遍历查询结果qDebug() << QString("Id: %1, Username: %2").arg(query.value("id").toInt()).arg(query.value("username").toString());}// 查询指定记录QString username = "李四";sql = "SELECT * FROM newUser WHERE username='" + username + "'";query.exec(sql); // [2] 执行sql语句while (query.next()) { // [3] 遍历查询结果qDebug() << QString("Id: %1, Username: %2").arg(query.value("id").toInt()).arg(query.value("username").toString());}// 绑定数据查询username = "张三";sql = "SELECT * FROM newUser WHERE username=:username";query.prepare(sql); // [2] 使用名称绑定的方式解析 SQL 语句query.bindValue(":username", username); // [3] 把占位符替换为传入的参数query.exec(); // [4] 执行数据库操作while (query.next()) { // [5] 遍历查询结果qDebug() << QString("Id: %1, Username: %2").arg(query.value("id").toInt()).arg(query.value("username").toString());}
}void MainWindow::on_pushButton_clear_table_clicked()
{QSqlQuery query(m_db);query.exec("DELETE FROM newUser");
}
main.cpp
#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>693</width><height>412</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="centralWidget"><layout class="QGridLayout" name="gridLayout"><item row="0" column="0"><widget class="QPushButton" name="pushButton"><property name="text"><string>查看数据库驱动</string></property></widget></item><item row="0" column="1"><widget class="QPushButton" name="pushButton_2"><property name="text"><string>连接mysql数据库</string></property></widget></item><item row="1" column="0"><widget class="QPushButton" name="pushButton_3"><property name="text"><string>创建表</string></property></widget></item><item row="1" column="1"><widget class="QPushButton" name="pushButton_4"><property name="text"><string>插入记录</string></property></widget></item><item row="2" column="0"><widget class="QPushButton" name="pushButton_5"><property name="text"><string>删除记录</string></property></widget></item><item row="2" column="1"><widget class="QPushButton" name="pushButton_6"><property name="text"><string>修改记录</string></property></widget></item><item row="3" column="0"><widget class="QPushButton" name="pushButton_7"><property name="text"><string>查询记录</string></property></widget></item><item row="3" column="1"><widget class="QPushButton" name="pushButton_clear_table"><property name="text"><string>删除表中所有数据</string></property></widget></item></layout></widget><widget class="QMenuBar" name="menuBar"><property name="geometry"><rect><x>0</x><y>0</y><width>693</width><height>39</height></rect></property></widget><widget class="QToolBar" name="mainToolBar"><attribute name="toolBarArea"><enum>TopToolBarArea</enum></attribute><attribute name="toolBarBreak"><bool>false</bool></attribute></widget><widget class="QStatusBar" name="statusBar"/></widget><layoutdefault spacing="6" margin="11"/><resources/><connections/>
</ui>
常见错误总结:
(1) 数据库服务没启动报错信息
(2) 有QMYSQL驱动,连接数据缺失败
原因:Qt对Mysql进行了封装,库名为libqsqlmysql.so,但是其还需要调用Mysql的客户端库才能真正连接数据库,如下可以看到libqsqlmysql.so需要依赖libmysqlclient.so.18。
相关文章:
Ubuntu下QT操作Mysql数据库
本篇总结一下一下Ubuntu下QT操作Mysql数据库。 目录 1. 启动Mysql数据库服务器 2.查看QT支持的数据库驱动 3.连接数据库 4. 增加表和记录 5. 删除记录 6. 修改记录 7. 查询记录 8.完整代码和运行效果 常见错误总结: (1) 数据库服务没启动报错信息 (2) 有…...
sqli --【1--10】
Less-1(联合查询) 1.查看是否有回显 2.查看是否有报错 3.使用联合查询(字符注入) 3.1判断其列数 3.2 判断显示位置 3.3敏感信息查询 Less-2(联合查询) 1.查看是否有回显 2.查看是否有报错 3.使用…...
《自然语言处理(NLP)的最新进展:Transformers与GPT-4的浅析》
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
Wireshark 用命令行分析数据包
1,那些情况需要使用命令行 Wireshark一次性提供了太多的信息。使用命令行工具可以限制打印出的信息,最后只显示相关数据,比如用单独一行来显示IP地址。命令行工具适用于过滤数据包捕获文件,并提供结果给另一个支持UNIX管道的工具…...
LVS DR模式负载均衡群集部署
目录 1 LVS-DR 模式的特点 1.1 数据包流向分析 1.2 DR 模式的特点 2 DR模式 LVS负载均衡群集部署 2.1 配置负载调度器 2.1.1 配置虚拟 IP 地址 2.1.2 调整 proc 响应参数 2.1.3 配置负载分配策略 2.2 部署共享存储 2.3 配置节点服务器 2.3.1 配置虚拟 IP 地址 2.3.2…...
探讨前后端分离开发的优势、实践以及如何实现更好的用户体验?
随着互联网技术的迅猛发展,前后端分离开发已经成为现代软件开发的一种重要趋势。这种开发模式将前端和后端的开发工作分开,通过清晰的接口协议进行通信,旨在优化开发流程、提升团队协作效率,并最终改善用户体验。本文将深入探讨前…...
微博一面:JVM预热,你的方案是啥?
说在前面 在40岁老架构师 尼恩的读者社区(50)中,最近有小伙伴拿到了一线互联网企业如微博、阿里、汽车之家、极兔、有赞、希音、百度、网易、滴滴的面试资格,遇到一几个很重要的面试题: JVM预热,你的方案是啥?Springb…...
open与fopen的区别
1. 来源 从来源的角度看,两者能很好的区分开,这也是两者最显而易见的区别: open是UNIX系统调用函数(包括LINUX等),返回的是文件描述符(File Descriptor),它是文件在文件…...
Unity记录一些glsl和hlsl的着色器Shader逆向代码
以下内容一般基于 GLSL 300 之后 以下某些代码行,是“伪代码“,绝大部分是renderDoc 逆向产生标准代码 本人OpenlGL零基础,也不打算重头学 目录 Clip() 剔除函数 discard; FS最终颜色输出 out 和最终颜色相加方程…...
基于Sentinel的微服务保护
前言 Sentinel是Alibaba开源的一款微服务流控组件,用于解决分布式应用场景下服务的稳定性问题。Sentinel具有丰富的应用场景,它基于流量提供一系列的服务保护措施,例如多线程秒杀情况下的系统承载,并发访问下的流量控制ÿ…...
Collectors类作用:
一、Collectors类: 1.1、Collectors介绍 Collectors类,是JDK1.8开始提供的一个的工具类,它专门用于对Stream操作流中的元素各种处理操作,Collectors类中提供了一些常用的方法,例如:toList()、toSet()、to…...
LASSO回归
LASSO回归 LASSO(Least Absolute Shrinkage and Selection Operator,最小绝对值收敛和选择算子算法)是一种回归分析技术,用于变量选择和正则化。它由Robert Tibshirani于1996年提出,作为传统最小二乘回归方法的替代品。 损失函数 1.线性回…...
机器学习中的 K-均值聚类算法及其优缺点。
K-均值聚类算法是一种常见的无监督学习算法,它可以将数据集分成 K 个簇,每个簇内部的数据点尽可能相似,而不同簇之间的数据点应尽可能不同。下面详细讲解 K-均值聚类算法的优缺点: 优点: 简单易用:K-均值…...
云计算与虚拟化
一、概念 什么是云计算? 云计算(cloud computing)是分布式计算的一种,指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序,然后,通过多部服务器组成的系统进行处理和分析这些小程序得到结果…...
Linux常见进程类别
目录 常见进程类别 守护进程&精灵进程 任务管理 进程组 作业 作业 | 进程组 会话 w命令 守护进程 守护进程的创建 setsid()函数 daemon()函数 模拟实现daemon函数 前台进程 | 后台进程 僵尸进程 | 孤儿进程 僵尸进程的一些细节 守护进程 | 后台进程 守护…...
智能小车之蓝牙控制并测速小车、wife控制小车、4g控制小车、语音控制小车
目录 1. 蓝牙控制小车 2. 蓝牙控制并测速小车 3. wifi控制测速小车 4. 4g控制小车 5. 语音控制小车 1. 蓝牙控制小车 使用蓝牙模块,串口透传蓝牙模块,又叫做蓝牙串口模块 串口透传技术: 透传即透明传送,是指在数据的传输过…...
指针进阶(一)
指针进阶 1. 字符指针面试题 2. 指针数组3. 数组指针3.1 数组指针的定义3.2 &数组名VS数组名 3.3 数组指针的使用4. 数组传参和指针传参4.1 一维数组传参4.2 二维数组传参4.3 一级指针传参4.4 二级指针传参 前言 指针的主题,我们在初级阶段的《指针》章节已经接…...
c# sql 判断表中是否包含指定字段
你可以使用以下方法来判断一个 SQL 数据库中的表是否包含指定的字段。 首先,你需要连接到数据库,然后执行一条 SQL 查询语句来检查表结构。你可以使用 SELECT 语句和 INFORMATION_SCHEMA.COLUMNS 系统视图来获取表中的所有列信息。 下面是一个示例代码…...
08-JVM垃圾收集器详解
上一篇:07-垃圾收集算法详解 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。 虽然我们对各个收集器进行比较,但并非为了挑选出一个最好的收集器。因为直到现在为止还没有最好的垃圾收集器出现,更加没…...
sql_mode详解
文章目录 一、sql_mode作用二、查询sql_mode三、mysql8默认的mode配置(6个默认配置)四、常见mode详细解释mysql8默认配置了的mode(6个)需要自己配置的mode(4个) 五、设置sql_mode(一旦设置了&am…...
Vue3的新特性总结
一、Vue3 里 script 的三种写法 首先,Vue3 新增了一个叫做组合式 api 的东西,英文名叫 Composition API。因此 Vue3 的 script 现在支持三种写法。 1、最基本的 Vue2 写法 <template><div>{{ count }}</div><button click"…...
【Node】Mac多版本Node切换
1、查看当前电脑是否安装node node -v或者查看当前电脑通过brew安装的node路径 ls /usr/local/Cellar/node*2、查看可安装的node brew search node3、安装其他版本node 下载需要安装的node版本 brew install node144、brew切换node版本 假设之前的版本是18,需…...
Apache POI
POI介绍 Apache POI是用Java编写的免费开源的跨平台的Java API, Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能, 其中使用最多的就是使用POI操作Excel文件。 maven坐标: <dependency><groupId>org.apa…...
个人能做股票期权吗?个人期权交易开户条件新规
个人投资者是可以交易股票期权的,不过期权交易通常需要投资者具备一定的投资经验和风险承受能力,因为期权交易涉及较高的风险和复杂性,下文为大家介绍个人能做股票期权吗?个人期权交易开户条件新规的内容。本文来自:期…...
Java面试整理(一)
开篇 面试,应该都是打工人需要面对的事情。我记得自己以前开始准备Java工程师面试时,都会去看那个《面试宝典》,当时这个“宝典”真的很经典,现在应该还是不少朋友会看这个。我自己经历过了找工作的面试,和企业招聘工作。所以我自己更加想从这两个不同的角度去和大家交流这…...
国家信息中心举办“数字政府建设暨数字安全技术”研讨会:海云安提出数字政府软件供应链安全解决方案
近日,由国家信息中心主办,复旦大学研究院承办的“数字政府建设暨数字安全技术研讨会”在义乌顺利召开。国家信息中心信息与网络安全部副主任禄凯,复旦大学党委常委、宣传部部长陈玉刚,义乌市委常委、常务副市长喻新贵为会议致辞。…...
uniapp 处理 分页请求
我的需求是手机上一个动态滚动列表,下拉到底部时,触发分页数据请求 uniapp上处理分页解决方案 主要看你是如何写出滚动条的。我想到的目前有三种 (1)页面滚动:直接使用onReachBottom方法,可以监听到达底部…...
最新2米分辨率北极开源DEM数据集(矢量文件)
一、项目背景 美国明尼苏达大学(University of Minnesota)的极地地理空间中心(Polar Geospatial Center, PGC)于2023年8月发布了北极数字高程模型4.1版本(ArcticDEM Mosaic 4.1)。该DEM数据集是革命性的,分辨率达到了2米,而一般的开源DEM数据集分辨率是3…...
【计算机网络】HTTP(下)
本文承接上文的代码进行改造,上文链接:HTTP上 文章目录 1. 实现网站跳转实现 自己的网站跳转 2. 请求方法(get) && 响应方法(post)GET方法POST方法GET与POST的应用场景 3. HTTP状态码在自己设计的代码中发现4043开头的状态码(重定向状态码)永久…...
自学Python03-学会Python中的while循环语句
我们来学习一下怎么使用列表和字典吧! 1.列表 首先,我们来学习一下列表。列表是一个有序的集合,它可以包含任何类型的数据,比如数字、字符串或其他列表。我们可以用方括号 [] 来创建一个列表,用逗号分隔各个元素。 …...
网站制作实例/网络培训心得体会5篇
leetCode题目-删除排序数组中都重复项给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下…...
广州建设网站下载/seo教学实体培训班
有多种方法使用 ADO.NET 调用存储过程并获得返回值和返回参数,其中包括: •使用 DataSet 对象,在获得返回值和返回参数之外,还可以收集并使用返回的数据行。•使用 DataReader 对象收集返回的行,遍历这些行,…...
互联网舆情监测平台/网站排名优化技巧
题目描述 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末…...
网站图片切换效果/郑州网站设计
下面是新版(v6版)一些操作的相关提示,主要是跟旧版不一样的地方一. 数据同步老用户(以前用过v5版并用邮箱注册过的用户)只能用邮箱登录,邮箱登录跟用QQ、微博、豆瓣登录是完全不同的账号,数据不互通。升级成功后,老用户登录请用邮…...
网站建设培训 店/seo排名优化首页
家庭组网,成为网友们近两年最热门的话题。家庭可以组网的方式有很多种,如两机互联、交换机组网、宽带路由器组网、无线组网、USB网线组网等等。在各种组网方式面前,经常会看到论坛中的很多朋友说自己想要组建家庭网络,不知道选择什…...
专业建设网站技术/百度手机快速排名点击软件
Prometheus介绍 使用领先的开源监控解决方案为您的指标和警报提供支持 在项目中,如果我们都使用 k8s 部署,那么就需要集成Prometheus 来监控和收集指标来提供告警功能,这对于企业内是有非常打的作用,Prometheus 天然支持ÿ…...