GO語言學習(17)Gorm的數據庫操作

目錄

🏆前言

1.Gorm的簡介

2.GORM連接數據庫?

2.1 配置DSN?

Mysql,TiDB,MariaDB

PostgreSQL

SQL Server

?SQLite

2.2 gorm.Open連接數據庫

3.數據庫連接池的配置??

4.使用GORM對數據庫進行操作(重點)?

4.1 創建數據表

4.2 CRUD操作?

GORM利用原生SQL執行

🏆前言

? ? ? ? 通過上一篇Go語言學習(16)Gin后端框架的學習,了解了基本的Go語言如何使用Gin進行前后端數據的傳輸,本文將進一步學習后端,了解如何使用Gorm與Mysql數據庫進行數據交互,實現基本的增刪改查功能。

1.Gorm的簡介

????????GORM 是 Go 語言中最流行的 ORM(對象關系映射)庫之一,支持主流數據庫(MySQL、PostgreSQL、SQLite、SQL Server 等),提供簡潔的 API 和強大的功能。其具有以下基本特點:

  • 簡潔易用:通過定義結構體來映射數據庫表,簡化數據操作。
  • 功能全面:支持CRUD、事務、預加載、關聯關系、自動遷移等常見功能。
  • 擴展性強:內置鉤子函數、插件機制以及對多種數據庫(MySQL、PostgreSQL、SQLite、SQL Server等)的支持。
  • 性能優秀:經過大量優化,能夠在高并發場景下保持穩定性能。?

? ? ? ? 當然Go語言當中的ORM庫不止Gorm一個,以下是一些其它Go當中的ORM庫的比較,可根據自身需求,進行選擇學習:

技術棧性能易用性功能適用場景
Gorm優秀,適合高并發場景非常友好,API簡潔明了,文檔齊全功能全面,支持多種數據庫,擴展性強適合各種規模的項目,尤其是需要高性能和復雜數據庫操作的場景
Xorm性能優異,經過大量優化API簡潔,支持鏈式調用支持基本的CRUD操作,查詢構建器靈活適合中小型項目,特別是對性能要求較高的場景
Beego ORM性能中等與Beego框架無縫集成,使用方便功能全面,但非Beego項目中配置復雜適合使用Beego框架的Web開發項目
Go-PG針對PostgreSQL優化,性能良好API設計符合PostgreSQL習慣,但學習成本較高充分利用PostgreSQL特性,支持高級查詢和事務管理適用于PostgreSQL數據庫的項目
upper.io/db性能中等模塊化設計,易于擴展和定制,但配置復雜支持多種數據庫,模塊化設計適用于需要支持多種數據庫的復雜項目

🍅?GORM的官方文檔連接👉:GORM官方文檔?

2.GORM連接數據庫?

? ? ? ?首先我們需要使用以下命令,安裝GORM與Mysql驅動引入到本地項目當中:

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

????????使用GORM連接數據庫,大體可以分為兩個步驟:

  1. 🌸配置DSN(Data Source Name,數據源名稱)
  2. 🌸使用gorm.Open連接數據庫

2.1 配置DSN?

?????????DSN(Data Source Name) 是一種用于連接數據庫的字符串,它包含了連接到數據庫所需的所有信息,如數據庫類型、主機地址、端口號、用戶名、密碼、數據庫名稱等。DSN通常用于數據庫驅動程序中,以簡化數據庫連接的配置。不同的數據庫連接中DSN的配置也不相同。

  • Mysql,TiDB,MariaDB

dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"//填上參數后的例子
//username = root
//password = 123456
//host     = localhost
//port     = 3306
//Dbname   = gorm
root:123456@tcp(localhost:3306)/gorm?charset=utf8&parseTime=True&loc=Local

?🌹各參數含義:

  1. user:數據庫用戶名。
  2. password:數據庫密碼。
  3. 127.0.0.1:數據庫服務器的IP地址。
  4. 3306:數據庫服務監聽的端口號。
  5. dbname:要連接的數據庫名稱。
  6. charset=utf8mb4:字符集設置。
  7. parseTime=True:啟用時間解析。
  8. loc=Local:時區設置。

? ? ? ? 由于TiDB,MariaDB與MySQL在功能上幾乎完全兼容,因此可以按照MySQL的DSN格式來連接:,但需要注意TiDB的默認端口號為4000,而不是3306。

  • PostgreSQL

dsn := "host=localhost user=gorm dbname=gorm password=gorm port=5432 sslmode=disable"

🌹各參數含義:

  1. host:數據庫服務器的主機名或IP地址。
  2. user:數據庫用戶名。
  3. dbname:要連接的數據庫名稱。
  4. password:數據庫密碼。
  5. port:數據庫服務監聽的端口號。
  6. sslmode:SSL模式,如disable、require等?
  • SQL Server

dsn := "sqlserver://username:password@localhost:1433?database=your_db"

?🌹各參數含義:

  1. username:數據庫用戶名。
  2. password:數據庫密碼。
  3. localhost:數據庫服務器的主機名或IP地址。
  4. 1433:數據庫服務監聽的端
  5. your_db:要連接的數據庫名稱。
  • ?SQLite

dsn := "gorm.db"

SQLite的DSN通常是一個文件路徑,表示數據庫文件的位置。

2.2 gorm.Open連接數據庫

? ? ? ? 配置好DSN之后,便可以使用open函數連接數據庫,下面以Mysq連接為例子。

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic("failed to connect database")}

? ? ? ? ?使用mysql.open讀取dsn進行數據庫連接,&gorm.Config{}?用于配置 GORM 的全局行為(可選參數),例如:Logger: 自定義日志輸出;SkipDefaultTransaction: 禁用默認事務;NamingStrategy: 表名和列名命名策略,此處使用空結構體 {} 表示使用默認配置。返回的db是一個 *gorm.DB 對象,代表數據庫連接池,后續所有數據庫操作都基于此對象。其余數據庫連接也是同理。

此外GORM 允許通過 DriverName 選項自定義 MySQL 驅動,例如:?

import (_ "example.com/my_mysql_driver""gorm.io/driver/mysql""gorm.io/gorm"
)db, err := gorm.Open(mysql.New(mysql.Config{DriverName: "my_mysql_driver",DSN: "gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True&loc=Local", // data source name, 詳情參考:https://github.com/go-sql-driver/mysql#dsn-data-source-name
}), &gorm.Config{})

3.數據庫連接池的配置??

????????數據庫連接池就像餐廳里的一群“備用服務員”。這些服務員已經站在廚房門口,隨時準備接單。當顧客來點菜時,直接從這群備用服務員中挑一個,用完后服務員會回到原位,繼續等待下一位顧客。這樣就避免了每次都要重新找服務員(建立連接)的麻煩,效率更高。然而連接池的設置并不能過大或者或小。

連接池設置過大的影響:

  1. 資源浪費:設置過大的連接池可能導致過多的數據庫連接被創建,占用過多的系統資源(如內存和CPU),從而導致資源浪費。
  2. 性能下降:過多的連接可能導致數據庫服務器負載過高,影響整體應用程序性能,甚至可能導致系統崩潰。
  3. 資源碎片化:過多的連接可能導致系統資源碎片化,降低系統的穩定性和響應速度。

連接池設置過小的影響:

  1. 連接不足:設置過小的連接池可能導致在高并發情況下請求無法及時獲取數據庫連接,從而影響并發性能和響應速度。
  2. 頻繁創建和銷毀連接:連接池過小會導致頻繁地創建和銷毀連接,增加了系統的開銷。
  3. 請求等待:在高并發情況下,請求可能會等待空閑連接,導致延遲增加,用戶體驗下降

在GORM中,我們可以參照以下示例,對連接池進行有關配置。?

dsn := "root:123456@tcp(127.0.0.1:3306)/golang?charset=utf8mb4&parseTime=True&loc=Local"
db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})sqlDB, err := db.DB()
if err != nil {panic("failed to get database connection")
}// 設置最大打開的連接數
sqlDB.SetMaxOpenConns(10)
// 設置最大空閑連接數
sqlDB.SetMaxIdleConns(5)
// 設置連接的最大存活時間
sqlDB.SetConnMaxLifetime(time.Hour)

下面解釋一下上述代碼最后三行代碼的配置分別代表什么,有什么作用。

// 設置最大打開的連接數
sqlDB.SetMaxOpenConns(10)

🌈通俗解釋
想象你開了一家餐廳,最多只能同時雇傭10個服務員。無論有多少顧客來,你最多只能同時派10個服務員去服務。這個數字就是“最大打開的連接數”。

??技術解釋
最大打開的連接數是指數據庫連接池中同時可以打開的數據庫連接的最大數量。如果設置為10,那么最多只能有10個連接同時處于“打開”狀態,用于執行數據庫操作。如果所有連接都被占用,新的請求需要等待,直到有連接被釋放。

// 設置最大空閑連接數
sqlDB.SetMaxIdleConns(5)

🌈通俗解釋:
繼續用餐廳的例子,假設你有10個服務員,但并不是所有服務員都一直有活干。有些服務員可能暫時沒事做(空閑)。你希望最多有5個服務員可以“待命”,隨時準備接單。這個數字就是“最大空閑連接數”。
??技術解釋:
最大空閑連接數是指連接池中允許存在的空閑連接的最大數量。空閑連接是指當前沒有被使用的連接。如果空閑連接數超過這個值,多余的連接會被關閉,以節省資源。

// 設置連接的最大存活時間
sqlDB.SetConnMaxLifetime(time.Hour)

🌈通俗解釋
假設你規定每個服務員最多只能連續工作1小時,之后必須休息或換人。這個時間限制就是“連接最大存活時間”。

??技術解釋
連接最大存活時間是指一個數據庫連接在連接池中可以存在的最長時間。如果一個連接已經存在了超過這個時間,它會被自動關閉,并從連接池中移除。這樣可以確保連接不會因為長時間使用而出現性能問題或資源泄漏。

4.使用GORM對數據庫進行操作(重點)?

? ? ? ? 首先,如果對結構體以及標簽(Tag)不熟悉的uu,還請移步到結構體標簽與反射機制,GORM對數據庫的基本操作與結構體類型數據非常相關。對結構體不熟悉的話,可能下面的代碼會看不懂QAQ。

4.1 創建數據表

? ? ? ? 假設我們現在需要構建一個 Students 表,那么我們得先創建一個Students的結構體類型數據,這一步我們稱為 定義操作模型 。如下:

type Students struct {StudentID uint   `gorm:"primaryKey;autoIncrement"`Name      string `gorm:"size:50;not null"`Major     string `gorm:"size:100"`Gender    string `gorm:"type:enum('男', '女');not null"`Phone     string `gorm:"size:11;not null"`
}

? ? ? ? 這里結構體使用 gorm 標簽,以下是關于 gorm 標簽常用的標簽字段表:

標簽說明示例
primaryKey標記字段為主鍵gorm:"primaryKey"
autoIncrement主鍵自增(僅支持整數類型)gorm:"primaryKey;autoIncrement"
column自定義數據庫列名gorm:"column:user_name"
type指定數據庫字段類型gorm:"type:varchar(100)"
size設置字段長度(如字符串類型)gorm:"size:255"
default設置字段默認值gorm:"default:'anonymous'"
not null字段不可為空gorm:"not null"
unique唯一約束(值不可重復)gorm:"unique"
uniqueIndex創建唯一索引(可指定索引名)gorm:"uniqueIndex:idx_email"
index創建普通索引gorm:"index"
check自定義檢查約束gorm:"check:age > 18"
autoCreateTime記錄創建時間(time.Time?類型)gorm:"autoCreateTime"
autoUpdateTime記錄更新時間(time.Time?類型)gorm:"autoUpdateTime"
foreignKey定義外鍵字段gorm:"foreignKey:UserID"
references定義關聯的主鍵字段gorm:"references:ID"
many2many定義多對多關聯的中間表gorm:"many2many:user_groups;"
polymorphic多態關聯(用于多模型共享關聯)gorm:"polymorphic:Owner"

?????????接著連接數據庫之后,使用?db.AutoMigrate() 啟用自動遷移模式,此時如果Students表不存在,則會依據上述定義的結構體,自動創建一個Students表,如果表已存在但是表的結構與結構體的結構不一樣,則會自動更新數據表的結構與結構體保持一致。?

	// 連接到Mysql數據庫dsn := "root:123456@tcp(127.0.0.1:3306)/golang?charset=utf8mb4&parseTime=True&loc=Local"db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})//自動遷移模式(如果表不存在,會自動創建)db.AutoMigrate(&Students{})

我們可以使用 Navicat 或者 sql語句 直接查看創建的數據表:

這里補充一下,GORM的結構體字段到數據庫字段的轉化是采取?Snake Case?風格轉換:

  • 結構體的名稱必須首字母大寫 ,并和數據庫表名稱對應。
  • 結構體中的字段名稱首字母必須大寫,并和數據庫表中的字段一一對應
  • Snake Case命名風格,就是各個單詞之間用下劃線(_)分隔,例如: CreateTime的Snake Case風格命名為create_time。
  • 在創建數據表過程中,默認情況表名是結構體名稱的復數形式。如果我們的結構體名稱定義成 User,表示這個模型默認操作的是 users 表。

4.2 CRUD操作?

下面以User表作為示例:

type User struct {ID    uint   `gorm:"primaryKey"` // 主鍵Name  string `gorm:"size:100"`    // 字符串長度限制Age   intEmail string `gorm:"unique"`     // 唯一約束
}

1.新增數據:

// 單條插入
user := User{Name: "Alice", Age: 25, Email: "alice@example.com"}
result := db.Create(&user) // 插入數據
if result.Error != nil {panic("插入失敗: " + result.Error.Error())
}
fmt.Println("插入成功,ID:", user.ID) // 自動填充主鍵// 批量插入
users := []User{{Name: "Bob", Age: 30, Email: "bob@example.com"},{Name: "Charlie", Age: 28, Email: "charlie@example.com"},
}
db.Create(&users)

2.查詢數據

// 查詢單條(按主鍵)
var user User
db.First(&user, 1) // 查詢 ID=1 的記錄
fmt.Println(user.Name)// 條件查詢
db.Where("age > ?", 20).First(&user)   // 第一條符合條件的記錄
db.Where("name LIKE ?", "%Ali%").Find(&user)// 查詢多條
var users []User
db.Where("age BETWEEN ? AND ?", 20, 30).Find(&users)// 選擇特定字段
db.Select("name", "age").Find(&users)// 排序和分頁
db.Order("age desc").Limit(10).Offset(0).Find(&users)

3.更新數據

// 更新單個字段
db.Model(&user).Update("age", 26) // 將 user 的 age 更新為 26// 更新多個字段
db.Model(&user).Updates(User{Name: "Alice Smith", Age: 27})// 條件更新(更新所有符合條件的記錄)
db.Where("age < ?", 18).Updates(User{Name: "未成年"})// 注意:Updates 默認忽略零值(如 Age:0),需用 Select 強制更新
db.Model(&user).Select("Age").Updates(User{Age: 0})

4.刪除數據

// 刪除單條記錄(軟刪除,需模型包含 DeletedAt 字段)
db.Delete(&user) // 實際執行 UPDATE 設置 deleted_at 時間// 硬刪除(物理刪除)
db.Unscoped().Delete(&user) // 直接從數據庫刪除// 條件刪除
db.Where("email LIKE ?", "%example.com").Delete(&User{})
  • 軟刪除:并不會真正從數據庫中移除數據,而是通過添加一個標記字段(如is_deleted或deleted_at)來表示數據是否被“刪除”。查詢時,通常會過濾掉這些被標記為已刪除的數據。
  • 硬刪除:硬刪除會直接從數據庫中移除數據,這些數據一旦刪除,就無法恢復(除非有備份)

GORM利用原生SQL執行

????????以上的CRUD操作都是基于GORM的封裝函數實現,如果習慣了寫 sql 的uu,也可以使用 db.Exec()以及db.Raw()來執行sql語句,具體使用可參考下面的示例代碼

完整實例:

package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm"
)type User struct {ID    uintName  stringAge   intEmail string
}func main() {dsn := "root:123456@tcp(127.0.0.1:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic("數據庫連接失敗")}// 插入db.Exec("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", "李四", 28, "lisi@example.com")// 查詢var user Userdb.Raw("SELECT * FROM users WHERE name = ?", "李四").Scan(&user)fmt.Printf("查詢結果: %+v\n", user)// 更新db.Exec("UPDATE users SET age = ? WHERE name = ?", 30, "李四")// 刪除db.Exec("DELETE FROM users WHERE name = ?", "李四")
}

? ? ? ? 至此17篇,我們終于學完了Go的后端開發的最為基礎的內容。

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

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

相關文章

【JavaEE】網絡原理詳解

1.????前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 親愛的朋友們&#x1f44b;&#x1f44b;&#xff0c;這里是E綿綿呀????。 如果你喜歡這篇文章&#xff0c;請別吝嗇你的點贊????和收藏&#x1f4d6;&#x1f4d6;。如果你對我的…

第十五屆藍橋杯單片機省賽程序設計試題

同時也是積分賽——測量NE555輸出脈沖頻率 第十五屆 藍橋杯 單片機設計與開發項目 省賽1 第二部分 程序設計試題&#xff08;85 分&#xff09; &#xff08;大學組&#xff09; 一 基本要求 1、使用大賽組委會統一提供的四梯單片機競賽實訓平臺&#xff0c;完成本試題程序…

JavaScript智能對話機器人——企業知識庫自動化

引言 內部知識管理常面臨信息分散、查找困難的問題。本文將使用Node.js和虎躍辦公的智能對話API&#xff0c;構建企業級知識問答機器人&#xff0c;支持自然語言查詢和自動學習。 核心技術 自然語言處理&#xff08;NLP&#xff09;意圖識別機器學習模型微調REST API集成 代…

元宇宙浪潮下,前端開發如何“乘風破浪”?

一、元宇宙對前端開發的新要求 元宇宙的興起&#xff0c;為前端開發領域帶來了全新的挑戰與機遇。元宇宙作為一個高度集成、多維互動的虛擬世界&#xff0c;要求前端開發不僅具備傳統網頁開發的能力&#xff0c;還需要掌握虛擬現實&#xff08;VR&#xff09;、增強現實&#…

Spring Boot 3.4.3 基于 Caffeine 實現本地緩存

在現代企業級應用中,緩存是提升系統性能和響應速度的關鍵技術。通過減少數據庫查詢或復雜計算的頻率,緩存可以顯著優化用戶體驗。Spring Boot 3.4.3 提供了強大的緩存抽象支持,而 Caffeine 作為一款高性能的本地緩存庫,因其優異的吞吐量和靈活的配置,成為許多開發者的首選…

QT Quick(C++)跨平臺應用程序項目實戰教程 6 — 彈出框

目錄 1. Popup組件介紹 2. 使用 上一章內容完成了音樂播放器程序的基本界面框架設計。本小節完成一個簡單的功能。單擊該播放器頂部菜單欄的“關于”按鈕&#xff0c;彈出該程序的相關版本信息。我們將使用Qt Quick的Popup組件來實現。 1. Popup組件介紹 Qt 中的 Popup 組件…

DuckDB系列教程:如何分析Parquet文件

Parquet 是一種強大的、基于列的存儲格式&#xff0c;適用于實現更快捷和更高效的數據分析。您可以使用 DuckDB 這種內存型分析數據庫來處理 Parquet 文件并運行查詢以對其進行分析。 在這篇文章中&#xff0c;我們將逐步介紹如何使用 DuckDB 對存儲在 Parquet 文件中的餐廳訂單…

異步框架使用loguru和contextvars實現日志按Id輸出

需求闡述 工作中使用fastStream模塊消費kafka事件的時候&#xff0c;遇到以下問題。1. 由于main.py模塊要用到許多其他模塊 &#xff0c;main模塊&#xff0c;和其他模塊都有日志輸出。2. 要實現異步消費事件&#xff0c;但是又不希望日志打印的很亂。3. 想著在每次消費事件的…

【HTTPS協議】

文章目錄 一、HTTPS二、HTTPS協議五種加密方案1.只使用對稱加密2.只使用非對稱加密3.雙方都使用非對稱加密4.對稱加密非對稱加密中間人攻擊理解數字簽名CA機構和證書 5. 對稱加密非對稱加密證書認證中間人篡改證書&#xff1f;中間人調包整個證書&#xff1f; 常見問題總結 一、…

算法設計學習8

實驗目的及要求&#xff1a; 通過深入學習樹&#xff08;Tree&#xff09;和二叉樹&#xff08;Binary Tree&#xff09;這兩種重要的數據結構&#xff0c;掌握它們的基本概念、性質和操作&#xff0c;提高對樹形結構的理解和應用能力。通過本實驗&#xff0c;學生將深化對樹和…

P17_ResNeXt-50

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 一、模型結構 ResNeXt-50由多個殘差塊&#xff08;Residual Block&#xff09;組成&#xff0c;每個殘差塊包含三個卷積層。以下是模型的主要結構&#xff1…

【YOLO系列(V5-V12)通用數據集-剪刀石頭布手勢檢測數據集】

YOLO格式的剪刀石頭布手勢檢測數據集&#xff0c;適用于YOLOv5-v11所有版本&#xff0c;可以用于本科畢設、發paper、做課設等等&#xff0c;有需要的在這里獲取&#xff1a; 【YOLO系列&#xff08;V5-V12&#xff09;通用數據集-剪刀石頭布手勢檢測數據集】 數據集專欄地址&a…

基于連接池與重試機制的高效TDengine寫入方案

摘要 在時序數據庫應用場景中,如何構建穩定高效的寫入機制是核心挑戰。本文基于提供的Python代碼實現,解析一種結合連接池管理、智能重試策略和事務控制的TDengine寫入方案,并分析其技術優勢與優化方向。 一、代碼 from dbutils.pooled_db import PooledDB import timede…

抖音熱點視頻識別與分片處理機制解析

抖音作為日活數億的短視頻平臺,其熱點視頻識別和分片處理機制是支撐高并發訪問的核心技術。以下是抖音熱點視頻識別與分片的實現方案: 熱點視頻識別機制 1. 實時行為監控系統 用戶行為聚合:監控點贊、評論、分享、完播率等指標的異常增長曲線內容特征分析:通過AI識別視頻…

基于RDK X3的“校史通“機器人:SLAM導航+智能交互,讓校史館活起來!

視頻標題&#xff1a; 【校史館の新晉頂流】RDK X3機器人&#xff1a;導覽員看了直呼內卷 視頻文案&#xff1a; 跑得賊穩團隊用RDK X3整了個大活——給校史館造了個"社牛"機器人&#xff01; 基于RDK X3開發板實現智能導航與語音交互SLAM技術讓機器人自主避障不…

Metal學習筆記十三:陰影

在本章中&#xff0c;您將了解陰影。陰影表示表面上沒有光。當另一個表面或對象使對象與光線相遮擋時&#xff0c;您會看到對象上的陰影。在項目中添加陰影可使您的場景看起來更逼真&#xff0c;并提供深度感。 陰影貼圖 陰影貼圖是包含場景陰影信息的紋理。當光線照射到物體…

Matplotlib:數據可視化的藝術與科學

引言&#xff1a;讓數據開口說話 在數據分析與機器學習領域&#xff0c;可視化是理解數據的重要橋梁。Matplotlib 作為 Python 最流行的繪圖庫&#xff0c;提供了從簡單折線圖到復雜 3D 圖表的完整解決方案。本文將通過實際案例&#xff0c;帶您從基礎繪圖到高級定制全面掌握 …

Python數據可視化-第4章-圖表樣式的美化

環境 開發工具 VSCode庫的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本書為《Python數據可視化》一書的配套內容&#xff0c;本章為第4章 圖表樣式的美化 本章主要介紹了圖表樣式的美化&#xff0c;包括圖表樣式概述、使用顏色、選擇線型、添加數據標記、設置字體…

嵌入式海思Hi3861連接華為物聯網平臺操作方法

1.1 實驗目的 快速演示 1、認識輕量級HarmonyOS——LiteOS-M 2、初步掌握華為云物聯網平臺的使用 3、快速驅動海思Hi3861 WIFI芯片,連接互聯網并登錄物聯網平臺

如何在Redis容量限制下保持熱點數據

如何在Redis容量限制下保持熱點數據 當數據庫有100萬條數據但Redis只能保存10萬條時,需要智能的策略來確保Redis中存儲的都是最常訪問的熱點數據。以下是幾種有效的解決方案: 一、內存淘汰策略 Redis提供了多種內存淘汰機制,當內存不足時會自動刪除部分數據: 策略命令/配…