Go語(yǔ)言使用GORM操作數(shù)據(jù)庫(kù)使用指南
簡(jiǎn)介
GORM(全稱為Go Object Relational Mapping)是一個(gè)在Go語(yǔ)言中使用的輕量級(jí)的對(duì)象關(guān)系映射(ORM)庫(kù)。ORM是一種編程技術(shù),用于將對(duì)象模型與關(guān)系型數(shù)據(jù)庫(kù)之間進(jìn)行映射,從而使開(kāi)發(fā)人員能夠使用面向?qū)ο蟮姆绞竭M(jìn)行數(shù)據(jù)庫(kù)操作。
GORM提供了一套簡(jiǎn)潔而強(qiáng)大的API,使得開(kāi)發(fā)人員能夠以簡(jiǎn)單的方式進(jìn)行數(shù)據(jù)庫(kù)的增刪改查操作,而無(wú)需直接編寫(xiě)SQL語(yǔ)句。它支持多種數(shù)據(jù)庫(kù),包括MySQL、PostgreSQL、SQLite等,并提供了豐富的功能,如事務(wù)處理、關(guān)聯(lián)關(guān)系、預(yù)加載、模型驗(yàn)證等。
使用GORM,你可以定義Go語(yǔ)言的結(jié)構(gòu)體來(lái)表示數(shù)據(jù)庫(kù)中的表,GORM將自動(dòng)根據(jù)這些結(jié)構(gòu)體定義創(chuàng)建、修改和查詢數(shù)據(jù)庫(kù)。它提供了豐富的方法和選項(xiàng),可以方便地進(jìn)行條件查詢、分頁(yè)、排序等操作。
安裝 GORM
要安裝 GORM,運(yùn)行以下命令:
go get -u gorm.io/gorm go get -u gorm.io/driver/mysql
這將安裝 GORM 核心庫(kù)以及 MySQL 驅(qū)動(dòng)程序。
連接到數(shù)據(jù)庫(kù)
首先,我們需要連接到數(shù)據(jù)庫(kù)。這里是一個(gè)使用 GORM 連接到 MySQL 數(shù)據(jù)庫(kù)的例子:
package main import ( "gorm.io/driver/mysql" "gorm.io/gorm" ) func main() { dsn := "user:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("failed to connect database") } // ... }
在這個(gè)示例中,我們使用 gorm.Open() 函數(shù)連接到數(shù)據(jù)庫(kù)。mysql.Open() 函數(shù)接受一個(gè) DSN 字符串,其中包含數(shù)據(jù)庫(kù)連接信息。
定義模型
GORM 使用結(jié)構(gòu)體來(lái)表示數(shù)據(jù)庫(kù)中的表。在這個(gè)例子中,我們將創(chuàng)建一個(gè)名為 User 的結(jié)構(gòu)體來(lái)表示一個(gè)用戶表:
type User struct { ID uint Name string Age int }
GORM 在處理數(shù)據(jù)庫(kù)表名時(shí)使用了一種約定:它會(huì)將結(jié)構(gòu)體名稱轉(zhuǎn)換為復(fù)數(shù)形式,并將其作為數(shù)據(jù)庫(kù)表名。這是 GORM 的默認(rèn)行為。所以,當(dāng)您定義了一個(gè)名為 User 的結(jié)構(gòu)體時(shí),GORM 會(huì)自動(dòng)將其映射到名為 users 的表。
這種約定起源于許多編程語(yǔ)言和框架中的一種慣例,即將表名表示為復(fù)數(shù)形式,以表示表中包含多個(gè)記錄。
如果您想要自定義表名,可以在結(jié)構(gòu)體中實(shí)現(xiàn) GORM 的 Tabler 接口。這是一個(gè)示例:
type User struct { ID uint Name string Age int } ???????func (u User) TableName() string { return "custom_users" }
在這個(gè)例子中,我們實(shí)現(xiàn)了 TableName() 方法并返回了自定義的表名 "custom_users"。現(xiàn)在,GORM 將使用 "custom_users" 作為表名,而不是默認(rèn)的 "users"。
GORM 將自動(dòng)將結(jié)構(gòu)體名稱映射到相應(yīng)的表名。在這種情況下,它將查找一個(gè)名為 users 的表。您還可以使用 GORM 標(biāo)簽來(lái)自定義字段和表名。
type User struct { ID uint `gorm:"column:id;primary_key"` // 自定義字段名為 "id" 并設(shè)置為主鍵 Name string `gorm:"column:name;type:varchar(100)"` // 自定義字段名為 "name" 且設(shè)置為 VARCHAR 類(lèi)型,最大長(zhǎng)度 100 Age int `gorm:"column:age;type:int;not null"` // 自定義字段名為 "age" 且設(shè)置為 INT 類(lèi)型,不允許為 NULL } ???????// 使用 TableName 方法自定義表名 func (User) TableName() string { return "custom_users" }
自動(dòng)遷移
GORM 支持自動(dòng)遷移,這意味著它可以自動(dòng)創(chuàng)建和更新數(shù)據(jù)庫(kù)表結(jié)構(gòu)。要執(zhí)行自動(dòng)遷移,請(qǐng)調(diào)用 AutoMigrate() 函數(shù):
db.AutoMigrate(&User{})
請(qǐng)注意,AutoMigrate() 函數(shù)不會(huì)刪除表中的數(shù)據(jù)或刪除未使用的列。
基本 CRUD 操作
插入記錄
要插入新記錄,可以使用 Create() 函數(shù):
user := User{Name: "John Doe", Age: 25} result := db.Create(&user)
Create() 函數(shù)將新記錄插入到數(shù)據(jù)庫(kù)中,并更新結(jié)構(gòu)體中的主鍵字段。
查詢記錄
要查詢記錄,可以使用 GORM 提供的各種查詢方法,例如 First(),F(xiàn)ind() 和 Where():
// 查詢單個(gè)記錄 var user User result := db.First(&user, 1) // 使用主鍵查詢 result := db.Where("name = ?", "John Doe").First(&user) // 使用條件查詢 ???????// 查詢多個(gè)記錄 var users []User result := db.Find(&users) // 查詢所有用戶記錄 result := db.Where("age > ?", 25).Find(&users) // 使用條件查詢多個(gè)記錄
GORM 支持鏈?zhǔn)讲樵儯梢愿鶕?jù)需要組合多個(gè)查詢條件。
更新記錄
要更新記錄,可以使用 Save() 或 Updates() 函數(shù):
// 更新單個(gè)記錄 user := User{ID: 1, Name: "Jane Doe", Age: 30} result := db.Save(&user) // 使用主鍵更新記錄 ???????// 使用條件更新多個(gè)記錄 result := db.Model(&User{}).Where("age > ?", 25).Updates(User{Name: "Updated Name"})
Save() 函數(shù)將使用主鍵更新記錄,而 Updates() 函數(shù)可以更新一個(gè)或多個(gè)記錄,具體取決于提供的條件。
刪除記錄
要?jiǎng)h除記錄,可以使用 Delete() 函數(shù):
// 刪除單個(gè)記錄 user := User{ID: 1} result := db.Delete(&user) // 使用主鍵刪除記錄 ???????// 使用條件刪除多個(gè)記錄 result := db.Where("age < ?", 18).Delete(&User{})
Delete() 函數(shù)可以刪除一個(gè)或多個(gè)記錄,具體取決于提供的條件。
詳細(xì)api詳解
1. 查詢
查詢單個(gè)記錄
var user User // 獲取匹配條件的第一條記錄 db.First(&user, 1) // 根據(jù)主鍵查詢 db.Where("name = ?", "John Doe").First(&user) // 根據(jù)條件查詢 // 獲取匹配條件的任意一條記錄 db.Take(&user) db.Where("name = ?", "John Doe").Take(&user) // 獲取匹配條件的最后一條記錄 db.Last(&user) db.Where("name = ?", "John Doe").Last(&user)
查詢多個(gè)記錄
var users []User // 獲取匹配條件的所有記錄 db.Find(&users) db.Where("age > ?", 25).Find(&users)
條件查詢
var users []User // 為查詢添加條件 db.Where("name = ?", "John Doe").Find(&users) // 為查詢添加或條件 db.Where("name = ?", "John Doe").Or("name = ?", "Jane Doe").Find(&users) // 為查詢添加非條件 db.Not("name = ?", "John Doe").Find(&users)
排序、限制和偏移
var users []User // 對(duì)查詢結(jié)果進(jìn)行排序 db.Order("age desc").Find(&users) // 限制查詢結(jié)果的數(shù)量 db.Limit(5).Find(&users) // 設(shè)置查詢結(jié)果的偏移量 db.Offset(10).Find(&users)
2. 插入
user := User{Name: "John Doe", Age: 25} result := db.Create(&user)
3. 更新
// 更新單個(gè)記錄 user := User{ID: 1, Name: "Jane Doe", Age: 30} result := db.Save(&user) // 使用主鍵更新記錄 // 使用條件更新多個(gè)記錄 result := db.Model(&User{}).Where("age > ?", 25).Updates(User{Name: "Updated Name"})
4. 刪除
// 刪除單個(gè)記錄 user := User{ID: 1} result := db.Delete(&user) // 使用主鍵刪除記錄 // 使用條件刪除多個(gè)記錄 result := db.Where("age < ?", 18).Delete(&User{})
總結(jié)
GORM(Go Object Relational Mapping)是一個(gè)輕量級(jí)的對(duì)象關(guān)系映射(ORM)庫(kù),用于在Go語(yǔ)言中進(jìn)行數(shù)據(jù)庫(kù)操作。下面是對(duì)GORM的總結(jié):
- 易用性:GORM提供了簡(jiǎn)潔而強(qiáng)大的API,使得開(kāi)發(fā)人員可以使用面向?qū)ο蟮姆绞竭M(jìn)行數(shù)據(jù)庫(kù)操作,而無(wú)需直接編寫(xiě)SQL語(yǔ)句。它采用了一種直觀的語(yǔ)法,易于理解和使用。
- 數(shù)據(jù)庫(kù)支持:GORM支持多種數(shù)據(jù)庫(kù),包括MySQL、PostgreSQL、SQLite等,可以輕松切換不同的數(shù)據(jù)庫(kù)引擎而無(wú)需更改代碼。
- 自動(dòng)映射:通過(guò)定義Go語(yǔ)言的結(jié)構(gòu)體來(lái)表示數(shù)據(jù)庫(kù)中的表,GORM能夠自動(dòng)創(chuàng)建、修改和查詢數(shù)據(jù)庫(kù)。它使用一種約定優(yōu)于配置的方式,將結(jié)構(gòu)體字段與數(shù)據(jù)庫(kù)表的列進(jìn)行映射,簡(jiǎn)化了數(shù)據(jù)庫(kù)操作的過(guò)程。
- 查詢和條件:GORM提供了豐富的方法和選項(xiàng),可以方便地進(jìn)行條件查詢、分頁(yè)、排序等操作。它支持鏈?zhǔn)秸{(diào)用,使得查詢代碼更加清晰和易于組合。
- 關(guān)聯(lián)關(guān)系:GORM支持定義和處理表之間的關(guān)聯(lián)關(guān)系,包括一對(duì)一、一對(duì)多、多對(duì)多等關(guān)系。它提供了方法來(lái)自動(dòng)處理關(guān)聯(lián)關(guān)系的加載、保存和刪除,簡(jiǎn)化了復(fù)雜的數(shù)據(jù)庫(kù)關(guān)聯(lián)操作。
- 事務(wù)處理:GORM支持事務(wù)操作,可以確保一系列數(shù)據(jù)庫(kù)操作的原子性。通過(guò)使用事務(wù),可以保證數(shù)據(jù)的一致性和完整性,同時(shí)提高數(shù)據(jù)庫(kù)的性能和效率。
- 預(yù)加載和延遲加載:GORM支持預(yù)加載關(guān)聯(lián)數(shù)據(jù),減少了數(shù)據(jù)庫(kù)的查詢次數(shù),提高了性能。同時(shí),它也支持延遲加載,只在需要時(shí)加載關(guān)聯(lián)數(shù)據(jù),避免了不必要的數(shù)據(jù)加載。
- 模型驗(yàn)證:GORM提供了模型驗(yàn)證功能,可以對(duì)結(jié)構(gòu)體中的字段進(jìn)行驗(yàn)證,確保數(shù)據(jù)的合法性和完整性。它支持自定義驗(yàn)證規(guī)則,并提供了方便的驗(yàn)證方法,簡(jiǎn)化了數(shù)據(jù)驗(yàn)證的過(guò)程。
總而言之,GORM是一個(gè)功能豐富、易用的ORM庫(kù),它簡(jiǎn)化了Go語(yǔ)言中與數(shù)據(jù)庫(kù)交互的過(guò)程。通過(guò)使用GORM,開(kāi)發(fā)人員可以更方便地進(jìn)行數(shù)據(jù)庫(kù)操作,減少了編寫(xiě)SQL語(yǔ)句的工作量,并提高了開(kāi)發(fā)效率和代碼的可維護(hù)性。
以上就是Go語(yǔ)言使用GORM操作數(shù)據(jù)庫(kù)使用指南的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言GORM操作數(shù)據(jù)庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go語(yǔ)言使用jwt認(rèn)證的實(shí)現(xiàn)
本文主要介紹了go語(yǔ)言使用jwt認(rèn)證的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04go語(yǔ)言實(shí)現(xiàn)通過(guò)FTP庫(kù)自動(dòng)上傳web日志
這篇文章主要介紹了go語(yǔ)言實(shí)現(xiàn)通過(guò)FTP庫(kù)自動(dòng)上傳web日志,非常簡(jiǎn)單實(shí)用,需要的小伙伴快來(lái)參考下吧。2015-03-03golang通過(guò)http訪問(wèn)外部網(wǎng)址的操作方法
這篇文章主要介紹了golang通過(guò)http訪問(wèn)外部網(wǎng)址的操作方法,分為?get方式訪問(wèn)外部的接口,Post方式請(qǐng)求外部接口,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02Go語(yǔ)言實(shí)戰(zhàn)學(xué)習(xí)之流程控制詳解
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中的流程控制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助?,需要的朋友可以參考下2022-08-08Go的固定時(shí)長(zhǎng)定時(shí)器和周期性時(shí)長(zhǎng)定時(shí)器
本文主要介紹了Go的固定時(shí)長(zhǎng)定時(shí)器和周期性時(shí)長(zhǎng)定時(shí)器,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08阿里云go開(kāi)發(fā)環(huán)境搭建過(guò)程
這篇文章主要介紹了阿里云go開(kāi)發(fā)環(huán)境搭建過(guò)程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02