qt 操作多個sqlite文件

qt 操作多個sqlite文件

  • Chapter1 qt 操作多個sqlite文件
    • 1. 引入必要的頭文件
    • 2. 創建并連接多個SQLite數據庫
    • 3. 代碼說明
    • 4. 注意事項
  • Chapter2 qt 多線程操作sqlite多文件
    • 1. 引入必要的頭文件
    • 2. 創建數據庫操作的工作線程類
    • 3. 在主線程中創建并啟動多個工作線程
    • 4. 代碼說明
    • 5. 運行結果
    • 6. 注意事項
  • Chapter3 QSqlQuery增刪改查操作
    • 1.插入一條記錄(增)
    • 2.查詢字段(查)
    • 3.刪除字段(刪)
    • 4.更新字段(改)
  • Chapter4 深入解析 Qt 中的 bindValue 方法
    • 引言
    • 1. bindValue 方法簡介
    • 2. 基本語法
    • 3. 參數化查詢的優勢
    • 4. 使用 bindValue 方法
    • 5. 示例代碼
    • 6. 處理查詢結果
    • 7. 示例代碼
    • 8. 錯誤處理
    • 9. 事務處理


Chapter1 qt 操作多個sqlite文件

在Qt中操作多個SQLite數據庫文件可以通過創建多個QSqlDatabase對象來實現。每個QSqlDatabase對象代表一個獨立的數據庫連接。以下是一個簡單的示例,展示如何在Qt中操作多個SQLite數據庫文件。

1. 引入必要的頭文件

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>

2. 創建并連接多個SQLite數據庫

int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 創建并連接第一個SQLite數據庫QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE", "connection1");db1.setDatabaseName("database1.db");if (!db1.open()) {qDebug() << "Error: Could not open database1.db";return -1;}// 創建并連接第二個SQLite數據庫QSqlDatabase db2 = QSqlDatabase::addDatabase("QSQLITE", "connection2");db2.setDatabaseName("database2.db");if (!db2.open()) {qDebug() << "Error: Could not open database2.db";return -1;}// 在第一個數據庫中執行查詢QSqlQuery query1(db1);if (!query1.exec("CREATE TABLE IF NOT EXISTS table1 (id INTEGER PRIMARY KEY, name TEXT)")) {qDebug() << "Error: Could not create table in database1.db" << query1.lastError();}// 在第二個數據庫中執行查詢QSqlQuery query2(db2);if (!query2.exec("CREATE TABLE IF NOT EXISTS table2 (id INTEGER PRIMARY KEY, value INTEGER)")) {qDebug() << "Error: Could not create table in database2.db" << query2.lastError();}// 插入數據到第一個數據庫if (!query1.exec("INSERT INTO table1 (name) VALUES ('Alice')")) {qDebug() << "Error: Could not insert data into database1.db" << query1.lastError();}// 插入數據到第二個數據庫if (!query2.exec("INSERT INTO table2 (value) VALUES (100)")) {qDebug() << "Error: Could not insert data into database2.db" << query2.lastError();}// 關閉數據庫連接db1.close();db2.close();return a.exec();
}

3. 代碼說明

QSqlDatabase::addDatabase(“QSQLITE”, “connection1”): 創建一個名為connection1的數據庫連接。"QSQLITE"表示使用SQLite數據庫驅動。

db1.setDatabaseName(“database1.db”): 設置數據庫文件的名稱。如果文件不存在,SQLite會自動創建它。

db1.open(): 打開數據庫連接。如果打開失敗,返回false。

QSqlQuery query1(db1): 創建一個與db1關聯的查詢對象。所有通過query1執行的SQL語句都會在db1中執行。

query1.exec(“CREATE TABLE …”): 執行SQL語句。如果執行失敗,可以通過query1.lastError()獲取錯誤信息。

db1.close(): 關閉數據庫連接。

4. 注意事項

連接名稱: 每個數據庫連接必須有一個唯一的名稱(如"connection1"和"connection2")。如果不指定名稱,Qt會使用默認連接。

資源管理: 確保在使用完數據庫后關閉連接,以釋放資源。

錯誤處理: 在實際應用中,應該對每個數據庫操作進行錯誤處理,以確保程序的健壯性。

通過這種方式,你可以在Qt中同時操作多個SQLite數據庫文件。

Chapter2 qt 多線程操作sqlite多文件

在Qt中使用多線程操作多個SQLite數據庫文件時,需要注意SQLite的線程安全性以及Qt的多線程機制。SQLite默認支持多線程操作,但需要確保每個線程使用獨立的數據庫連接,以避免競爭條件。

以下是一個示例,展示如何在Qt中使用多線程操作多個SQLite數據庫文件。

1. 引入必要的頭文件

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QThread>
#include <QDebug>
#include <QList>
#include <QMutex>

2. 創建數據庫操作的工作線程類

每個線程負責操作一個獨立的SQLite數據庫文件。

class DatabaseWorker : public QObject
{Q_OBJECTpublic:DatabaseWorker(const QString &connectionName, const QString &databaseName, QObject *parent = nullptr): QObject(parent), m_connectionName(connectionName), m_databaseName(databaseName) {}public slots:void process(){// 創建數據庫連接QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", m_connectionName);db.setDatabaseName(m_databaseName);if (!db.open()) {qDebug() << "Error: Could not open database" << m_databaseName << "in thread" << QThread::currentThread();emit finished();return;}// 執行數據庫操作QSqlQuery query(db);if (!query.exec("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, value TEXT)")) {qDebug() << "Error: Could not create table in" << m_databaseName << query.lastError();}for (int i = 0; i < 10; ++i) {if (!query.exec(QString("INSERT INTO test (value) VALUES ('%1')").arg(QString::number(i)))) {qDebug() << "Error: Could not insert data into" << m_databaseName << query.lastError();}}qDebug() << "Database" << m_databaseName << "processed in thread" << QThread::currentThread();// 關閉數據庫連接db.close();emit finished();}signals:void finished();private:QString m_connectionName;QString m_databaseName;
};

3. 在主線程中創建并啟動多個工作線程

int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 定義數據庫文件列表QList<QString> databaseFiles = {"database1.db", "database2.db", "database3.db"};// 創建線程和工作者對象QList<QThread*> threads;QList<DatabaseWorker*> workers;for (int i = 0; i < databaseFiles.size(); ++i) {QString connectionName = QString("connection%1").arg(i);QString databaseName = databaseFiles.at(i);// 創建工作線程QThread *thread = new QThread();DatabaseWorker *worker = new DatabaseWorker(connectionName, databaseName);// 將工作者移動到線程中worker->moveToThread(thread);// 連接信號和槽QObject::connect(thread, &QThread::started, worker, &DatabaseWorker::process);QObject::connect(worker, &DatabaseWorker::finished, thread, &QThread::quit);QObject::connect(worker, &DatabaseWorker::finished, worker, &DatabaseWorker::deleteLater);QObject::connect(thread, &QThread::finished, thread, &QThread::deleteLater);// 啟動線程thread->start();// 保存線程和工作者對象threads.append(thread);workers.append(worker);}// 等待所有線程完成for (QThread *thread : threads) {thread->wait();}qDebug() << "All databases processed.";return a.exec();
}

4. 代碼說明

DatabaseWorker類:

每個DatabaseWorker對象負責操作一個SQLite數據庫文件。

使用QSqlDatabase::addDatabase創建獨立的數據庫連接,并通過moveToThread將工作者對象移動到獨立的線程中。

多線程機制:

每個數據庫操作在一個獨立的線程中執行,避免阻塞主線程。

使用QThread管理線程的生命周期,并通過信號槽機制實現線程間通信。

線程安全性:

SQLite支持多線程操作,但每個線程必須使用獨立的數據庫連接。

如果多個線程需要訪問同一個數據庫文件,可以使用QMutex或SQLite的寫鎖機制來避免競爭條件。

資源管理:

在線程完成任務后,調用quit()和deleteLater()釋放線程和工作者對象。

5. 運行結果

程序會創建多個線程,每個線程操作一個獨立的SQLite數據庫文件。輸出示例如下:

復制
Database “database1.db” processed in thread QThread(0x12345678)
Database “database2.db” processed in thread QThread(0x23456789)
Database “database3.db” processed in thread QThread(0x34567890)
All databases processed.

6. 注意事項

SQLite的線程模式:

SQLite默認支持多線程操作,但需要確保每個線程使用獨立的連接。

如果需要更高的并發性,可以啟用SQLite的WAL模式(Write-Ahead Logging)。

線程數量:

不要創建過多的線程,否則可能會導致性能下降。可以根據實際需求調整線程數量。

錯誤處理:

在實際應用中,應該對每個數據庫操作進行錯誤處理,以確保程序的健壯性。

通過這種方式,你可以在Qt中高效地使用多線程操作多個SQLite數據庫文件。

Chapter3 QSqlQuery增刪改查操作

我們需要插入多條數據,此時可以使用 QSqlQuery::exec() 函數一條一條插入數據,但是這里我們選擇了另外一種方法:批量執行。首先,我們使用 QSqlQuery::prepare() 函數對這條 SQL 語句進行預處理,問號?相當于占位符,預示著以后我們可以使用實際數據替換這些位置。簡單說明一下,預處理是數據庫提供的一種特性,它會將 SQL 語句進行編譯,性能和安全性都要優于普通的 SQL 處理。在上面的代碼中,我們使用一個字符串列表 names 替換掉第一個問號的位置,一個整型列表 ages 替換掉第二個問號的位置,利用 QSqlQuery::addBindValue() 我們將實際數據綁定到這個預處理的 SQL 語句上。需要注意的是,names 和 ages 這兩個列表里面的數據需要一一對應。然后我們調用 QSqlQuery::execBatch() 批量執行 SQL,之后結束該對象。這樣,插入操作便完成了。

另外說明一點,我們這里使用了 ODBC 風格的?占位符,同樣,我們也可以使用 Oracle 風格的占位符:

query.prepare("INSERT INTO student (name, age) VALUES (:name, :age)");

此時,我們就需要使用

query.bindValue(":name", names);
query.bindValue(":age", ages);

進行綁定。Oracle 風格的綁定最大的好處是,綁定的名字和值很清晰,與順序無關。但是這里需要注意,bindValue() 函數只能綁定一個位置。比如

query.prepare("INSERT INTO test (name1, name2) VALUES (:name, :name)");
// ...
query.bindValue(":name", name);

只能綁定第一個 :name 占位符,不能綁定到第二個。

接下來我們依舊使用同一個查詢對象執行一個 SELECT 語句。如果存在查詢結果,QSqlQuery::next() 會返回 true,直到到達結果最末,返回 false,說明遍歷結束。我們利用這一點,使用 while 循環即可遍歷查詢結果。使用 QSqlQuery::value() 函數即可按照 SELECT 語句的字段順序獲取到對應的數據庫存儲的數據。

對于數據庫事務的操作,我們可以使用 QSqlDatabase::transaction() 開啟事務,QSqlDatabase::commit() 或者 QSqlDatabase::rollback() 結束事務。使用 QSqlDatabase::database() 函數則可以根據名字獲取所需要的數據庫連接。

bool Widget::saveToDb(double value1, double value2, double value3, double value4)
{// 插入數據到第二個數據庫QSqlQuery query2(db2);query2.prepare("INSERT INTO table2 (value1, value2, value3, value4) VALUES (:value1, :value2, :value3, :value4)");query2.bindValue(":value1", value1);query2.bindValue(":value2", value2);query2.bindValue(":value3", value3);query2.bindValue(":value4", value4);if (!query2.exec()) {qDebug() << "Error: Could not insert data into database2.db" << query2.lastError();QMessageBox::information(this, "錯誤", "插入記錄失敗: \n" + query2.lastError().text());}QMessageBox::information(this, "提示", "插入完成!");return true;
}void Widget::on_pBtn_insert_clicked()
{double v1 = ui->lineEdit1->text().toDouble();double v2 = ui->lineEdit2->text().toDouble();double v3 = ui->lineEdit3->text().toDouble();double v4 = ui->lineEdit4->text().toDouble();this->saveToDb(v1, v2, v3, v4);
}

1.插入一條記錄(增)

QSqlQuery query;
query.prepare("INSERT INTO table_name (column1, column2, column3) VALUES (:value1, :value2, :value3)");
query.bindValue(":value1", value1);
query.bindValue(":value2", value2);
query.bindValue(":value3", value3);
query.exec();

2.查詢字段(查)

QSqlQuery query;
query.prepare("SELECT * FROM table_name WHERE column1 = :value1 AND column2 = :value2 AND column3 = :value3");
query.bindValue(":value1", value1);
query.bindValue(":value2", value2);
query.bindValue(":value3", value3);
query.exec();// 處理查詢結果
while (query.next()) {// 在這里處理每一行的數據
}

3.刪除字段(刪)

QSqlQuery query;
query.prepare("DELETE FROM table_name WHERE column1 = :value1 AND column2 = :value2 AND column3 = :value3");
query.bindValue(":value1", value1);
query.bindValue(":value2", value2);
query.bindValue(":value3", value3);
query.exec();

4.更新字段(改)

QSqlQuery query;
query.prepare("UPDATE table_name SET column2 = :value2, column3 = :value3 WHERE column1 = :value1");
query.bindValue(":value1", value1);
query.bindValue(":value2", value2);
query.bindValue(":value3", value3);
query.exec();

Chapter4 深入解析 Qt 中的 bindValue 方法

原文鏈接:https://blog.csdn.net/festaw/article/details/140503911

引言

在應用程序開發中,數據庫交互是常見的需求之一。為了確保應用程序的安全性和數據的準確性,Qt 提供了多種工具和方法來幫助開發者實現這一目標。其中,bindValue 方法是 QSqlQuery 類中一個非常關鍵的成員函數,用于實現參數化查詢。本文將詳細介紹 bindValue 方法的基本概念、使用方式以及在實際開發中的應用。

1. bindValue 方法簡介

bindValue 方法是 QSqlQuery 類的一個成員函數,用于將實際的數據值綁定到參數化 SQL 語句中的占位符。這種方法可以有效防止 SQL 注入攻擊,是一種安全的數據操作實踐。

2. 基本語法

bindValue 方法的基本語法如下:

bool QSqlQuery::bindValue(const QString &placeholder, const QVariant &val)

placeholder:SQL 語句中的占位符,通常是一個字符串。
val:要綁定的數據值,類型為 QVariant。

3. 參數化查詢的優勢

使用參數化查詢有以下優勢:

安全性:防止 SQL 注入攻擊。
靈活性:可以輕松地替換和修改數據值。
性能:數據庫可以緩存和重用參數化查詢的執行計劃。

4. 使用 bindValue 方法

在使用 bindValue 方法之前,通常需要先使用 prepare 方法準備一個參數化的 SQL 語句。以下是使用 bindValue 方法的基本步驟:

準備 SQL 語句:使用 prepare 方法準備 SQL 語句。
綁定值:使用 bindValue 方法將數據值綁定到 SQL 語句的占位符。
執行查詢:使用 exec 方法執行 SQL 語句。

5. 示例代碼

以下是一個使用 bindValue 方法的示例:

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("example.db");if (!db.open()) {qDebug() << "Error: Unable to open database";return 1;}QSqlQuery query;query.setDatabase(db);// 準備 SQL 語句query.prepare("INSERT INTO people (name, age) VALUES (:name, :age)");// 綁定值query.bindValue(":name", "John Doe");query.bindValue(":age", 30);// 執行查詢if (query.exec()) {qDebug() << "Query executed successfully";} else {qDebug() << "Error:" << query.lastError().text();}return a.exec();
}

在這個示例中,我們準備了一個插入語句,并將兩個參數 name 和 age 綁定到實際的數據值上。

6. 處理查詢結果

對于查詢操作,除了執行 SQL 語句外,還需要處理查詢結果。以下是處理查詢結果的步驟:

執行查詢:使用 exec 方法執行 SQL 查詢語句。
逐行讀取結果:使用 next 方法逐行讀取查詢結果。
獲取字段值:使用 value 方法獲取每行的字段值。

7. 示例代碼

以下是一個處理查詢結果的示例:

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("example.db");if (!db.open()) {qDebug() << "Error: Unable to open database";return 1;}QSqlQuery query;query.setDatabase(db);// 創建表query.exec("CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)");// 插入數據query.exec("INSERT INTO people (name, age) VALUES ('John Doe', 30)");// 準備查詢query.prepare("SELECT * FROM people WHERE name = :name");// 綁定參數query.bindValue(":name", "John Doe");// 執行查詢if (query.exec()) {while (query.next()) {int id = query.value(0).toInt();QString name = query.value(1).toString();int age = query.value(2).toInt();qDebug() << "ID:" << id << "Name:" << name << "Age:" << age;}} else {qDebug() << "Error:" << query.lastError().text();}return a.exec();
}

8. 錯誤處理

在執行 SQL 語句時,可能會遇到各種錯誤。QSqlQuery 提供了一些方法來檢查和處理這些錯誤:

if (!query.exec()) {qDebug() << "Error:" << query.lastError().text();
}

9. 事務處理

在處理數據庫事務時,bindValue 方法同樣可以發揮作用。通過準備和執行 SQL 語句,可以確保事務的一致性和完整性。以下是事務處理的示例:

QSqlQuery query;
query.setDatabase(db);query.startTransaction();
query.exec("INSERT INTO people (name, age) VALUES ('Alice', 25)");
query.exec("INSERT INTO people (name, age) VALUES ('Bob', 35)");
if (!query.commit()) {query.rollback();qDebug() << "Transaction failed:" << query.lastError().text();
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72934.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72934.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72934.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

最新版本WebContext構造函數-避坑

import org.thymeleaf.context.IWebContext; import org.thymeleaf.context.WebContext; 當你想把頁面信息全部獲取出來存到redis緩存中使用時&#xff0c;SpringWebContext在Spring5中報錯 SpringWebContext ctx new SpringWebContext(request, response,request.getServlet…

用Python分割并高效處理PDF大文件

在處理大型PDF文件時&#xff0c;將它們分解成更小、更易于管理的塊通常是有益的。這個過程稱為分區&#xff0c;它可以提高處理效率&#xff0c;并使分析或操作文檔變得更容易。在本文中&#xff0c;我們將討論如何使用Python和為Unstructured.io庫將PDF文件劃分為更小的部分。…

neo4j隨筆-將csv文件導入知識圖譜

目錄 導入前的準備 導入csv文件 導入nodes1.1.csv并動態為節點添加標簽 ?編輯導入relations1.1.csv并動態為關系添加標簽 結果 導入前的準備 我有兩個csv文件 nodes1.1.csv存放節點信息,用記事本打開&#xff0c;能正常顯示&#xff0c;且編碼為UTF-8&#xff0c;就可以…

cpu 多級緩存L1、L2、L3 與主存關系

現代 CPU 的多級緩存&#xff08;L1、L2、L3&#xff09;和主存&#xff08;DRAM&#xff09;構成了一個層次化的內存系統&#xff0c;旨在通過減少內存訪問延遲和提高數據訪問速度來優化計算性能。以下是對多級緩存和主存的詳細解析&#xff1a; 1. 緩存層次結構 現代 CPU 通…

C++:入門詳解(關于C與C++基本差別)

目錄 一.C的第一個程序 二.命名空間&#xff08;namespace&#xff09; 1.命名空間的定義與使用&#xff1a; &#xff08;1&#xff09;命名空間里可以定義變量&#xff0c;函數&#xff0c;結構體等多種類型 &#xff08;2&#xff09;命名空間調用&#xff08;&#xf…

Python的學習篇(七)--網頁結構

七、網頁&#xff08;HTML&#xff09;結構 7.1 HTML介紹 HTML(Hyper Text Markup Language)&#xff0c;超文本標記語言。 超文本&#xff1a;比文本的功能要強大&#xff0c;通過鏈接和交互式的方式來組織與呈現信息的文本形式。不僅僅有文本&#xff0c;還可以包含圖片、…

*VulnHub-FristiLeaks:1.3暴力解法、細節解法,主打軟硬都吃,隧道搭建、尋找exp、提權、只要你想沒有做不到的姿勢

*VulnHub-FristiLeaks:1.3暴力解法、細節解法&#xff0c;主打軟硬都吃&#xff0c;隧道搭建、尋找exp、提權、只要你想沒有做不到的姿勢 一、信息收集 1、掃靶機ip 經典第一步&#xff0c;掃一下靶機ip arp-scan -l 掃描同網段 nmap -sP 192.168.122.0/242、指紋掃描、端口…

PHP:格式化JSON為PHP語法格式

1. 原生函數 $arr [1,2,3,4]; $str var_export($a,true); var_dump($str); 2. 自定義方法 class Export{private static $space;private static function do($a, string $prev){$res ;$next $prev . self::$space;if (is_array($a)) {$res . [;foreach ($a as $k > $…

【Python 數據結構 9.樹】

我裝作漠視一切&#xff0c;其實我在乎的太多&#xff0c;但我知道抓得越緊越容易失去 —— 25.3.6 一、樹的基本概念 1.樹的定義 樹是n個結點的有限集合&#xff0c;n0時為空樹。當n大于0的時候&#xff0c;滿足如下兩個條件&#xff1a; ① 有且僅有一個特定的結點&#xff…

pyqt聯合designer的運用和設置

PyQt Designer 簡介 PyQt Designer 是一個用于創建和設計 PyQt 應用程序用戶界面的可視化工具。它允許用戶通過拖放方式添加和排列各種控件,如按鈕、文本框、滑塊等,并設置它們的屬性和樣式,從而快速構建出美觀且功能完整的 UI 界面。 Windows版本:【免費】安裝包別管啊啊…

純html文件實現目錄和文檔關聯

目錄結構 效果圖 代碼 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>項目結題報告</title><style lang"scss">::-webkit-scrollbar {width: 6px;height: 6px;}::-webkit-scro…

python用戶圖形界面wxpython庫安裝與使用

要開始使用 wxPython 庫來創建 Python 用戶圖形界面&#xff0c;首先需要安裝這個庫。在大多數情況下&#xff0c;你可以通過 pip 來安裝 wxPython。下面我會指導你完成安裝過程&#xff0c;并給出一個簡單的例子來展示如何使用 wxPython 創建一個基本的窗口應用程序。 安裝 w…

MongoDB winx64 msi包安裝詳細教程

首先我們可以從官網上選擇對應版本和對應的包類型進行安裝&#xff1a; 下載地址&#xff1a;Download MongoDB Community Server | MongoDB 這里可以根據自己的需求&#xff0c; 這里我選擇的是8.0.5 msi的版本&#xff0c;采用的傳統裝軟件的方式安裝。無需配置命令。 下載…

如何借助 ArcGIS Pro 高效統計基站 10km 范圍內的村莊數量?

在當今數字化時代&#xff0c;地理信息系統&#xff08;GIS&#xff09;技術在各個領域都發揮著重要作用。 特別是在通信行業&#xff0c;對于基站周邊覆蓋范圍內的地理信息分析&#xff0c;能夠幫助我們更好地進行網絡規劃、資源分配以及市場分析等工作。 今天&#xff0c;就…

saltstack通過master下發腳本批量修改minion_id,修改為IP

通過master下發腳本批量修改minion_id&#xff0c;以修改為IP為例 通過cmd.script遠程執行shell腳本修改minion_id&#xff0c;步驟如下: # 下發腳本并執行 >> salt old_minion_id cmd.script salt://modify_minion_id.sh saltenvdev #輸出結果 old_minion_id:Minion di…

【大模型】WPS 接入 DeepSeek-R1詳解,打造全能AI辦公助手

目錄 一、前言 二、WPS接入AI工具優勢??????? 三、WPS接入AI工具兩種方式 3.1 手動配置的方式 3.2 Office AI助手 四、WPS手動配置方式接入AI大模型 4.1 安裝VBA插件 4.1.1 下載VBA插件并安裝 4.2 配置WPS 4.3 WPS集成VB 4.4 AI助手效果測試 4.5 配置模板文…

《蒼穹外賣》SpringBoot后端開發項目重點知識整理(DAY1 to DAY3)

目錄 一、在本地部署并啟動Nginx服務1. 解壓Nginx壓縮包2. 啟動Nginx服務3. 驗證Nginx是否啟動成功&#xff1a; 二、導入接口文檔1. 黑馬程序員提供的YApi平臺2. YApi Pro平臺3. 推薦工具&#xff1a;Apifox 三、Swagger1. 常用注解1.1 Api與ApiModel1.2 ApiModelProperty與Ap…

Mysql5.7-yum安裝和更改mysql數據存放路徑-2020年記錄

記錄下官網里用yum rpm源安裝mysql, 1 官網下載rpm https://dev.mysql.com/downloads/repo/yum/ https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html&#xff08;附官網操作手冊&#xff09; wget https://repo.mysql.com//mysql80-community-release…

HTML5(Web前端開發筆記第一期)

p.s.這是萌新自己自學總結的筆記&#xff0c;如果想學習得更透徹的話還是請去看大佬的講解 目錄 三件套標簽標題標簽段落標簽文本格式化標簽圖像標簽超鏈接標簽錨點鏈接默認鏈接地址 音頻標簽視頻標簽 HTML基本骨架綜合案例->個人簡介列表表格表單input標簽單選框radio上傳…

Oracle19c進入EM Express(Oracle企業管理器)詳細步驟

以下是使用Oracle 19c進入Oracle Enterprise Manager Database Express&#xff08;EM Express&#xff09;的詳細步驟&#xff1a; ### **步驟 1&#xff1a;確認EM Express配置狀態** 1. **登錄數據庫服務器** 使用Oracle用戶或管理員權限賬戶登錄操作系統。 2. **查看EM…