目录
- 一、概要
- 二、上手步骤
- (一)安装 GORM
- (二)连接数据库
- (三)定义模型
- (四)CRUD 操作示例
- 1. 创建记录
- 2. 查询记录
- 3. 更新记录
- 4. 删除记录
- (五)高级功能示例
- 1. 事务处理
- 2. 钩子(Hooks)
- 三、完整示例
- 四、结语
一、概要
什么是GORM?
GORM 是 Go 语言中一个非常流行的 ORM(对象关系映射)库、是一个功能强大且易于使用的 ORM 库,用于简化与数据库的交互。
它支持多种数据库(如 MySQL、PostgreSQL、SQLite 等),并提供了丰富的功能,如模型定义、CRUD 操作、事务处理、钩子(Hooks)等。适合在 Go 语言中操作数据库,可通过定义模型、使用 CRUD 操作和事务处理,可以快速构建数据库驱动的应用程序。
二、上手步骤
直接上手!
(一)安装 GORM
首先,使用以下命令安装 GORM 和数据库驱动(以 MySQL 为例):
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
(二)连接数据库
使用 GORM 连接数据库:
package mainimport ("gorm.io/driver/mysql""gorm.io/gorm"
)func main() {// 数据库连接信息dsn := "user:password@tcp(127.0.0.1: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")}// 自动迁移(创建表)db.AutoMigrate(&User{})
}
(三)定义模型
定义一个 Go 结构体来表示数据库表:
type User struct {gorm.Model // 内嵌 gorm.Model,包含 ID、CreatedAt、UpdatedAt、DeletedAt 字段Name string `gorm:"size:255"` // 用户名Email string `gorm:"uniqueIndex"` // 邮箱,唯一索引Age int // 年龄
}
(四)CRUD 操作示例
1. 创建记录
func createUser(db *gorm.DB) {user := User{Name: "Alice", Email: "alice@example.com", Age: 25}result := db.Create(&user) // 插入数据if result.Error != nil {panic(result.Error)}fmt.Println("User created:", user.ID)
}
2. 查询记录
func findUser(db *gorm.DB) {var user Userresult := db.First(&user, "email = ?", "alice@example.com") // 查询第一条记录if result.Error != nil {panic(result.Error)}fmt.Println("Found user:", user)
}
3. 更新记录
func updateUser(db *gorm.DB) {var user Userdb.First(&user, "email = ?", "alice@example.com") // 查询用户db.Model(&user).Update("Age", 30) // 更新年龄fmt.Println("Updated user:", user)
}
4. 删除记录
func deleteUser(db *gorm.DB) {var user Userdb.First(&user, "email = ?", "alice@example.com") // 查询用户db.Delete(&user) // 删除用户fmt.Println("Deleted user:", user)
}
(五)高级功能示例
1. 事务处理
func transactionExample(db *gorm.DB) {tx := db.Begin() // 开始事务defer func() {if r := recover(); r != nil {tx.Rollback() // 回滚事务}}()user1 := User{Name: "Bob", Email: "bob@example.com", Age: 30}if err := tx.Create(&user1).Error; err != nil {tx.Rollback() // 回滚事务panic(err)}user2 := User{Name: "Charlie", Email: "charlie@example.com", Age: 35}if err := tx.Create(&user2).Error; err != nil {tx.Rollback() // 回滚事务panic(err)}tx.Commit() // 提交事务fmt.Println("Transaction completed")
}
2. 钩子(Hooks)
GORM 支持在模型的生命周期中插入钩子函数。例如,在创建记录前自动设置字段:
func (u *User) BeforeCreate(tx *gorm.DB) (err error) {fmt.Println("BeforeCreate hook:", u.Name)return
}
下面列举一下完成的钩子,用法都是一样的:
BeforeSave
:在保存之前调用,无论是创建还是更新操作。BeforeCreate
:在创建之前调用。AfterCreate
:在创建之后调用。BeforeUpdate
:在更新之前调用。AfterUpdate
:在更新之后调用。AfterSave
:在保存之后调用,无论是创建还是更新操作。BeforeDelete
:在删除之前调用。AfterDelete
:在删除之后调用。AfterFind
:在查询之后调用,用于单个对象查询。
三、完整示例
package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm"
)type User struct {gorm.ModelName string `gorm:"size:255"`Email string `gorm:"uniqueIndex"`Age int
}func main() {dsn := "user:password@tcp(127.0.0.1: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")}db.AutoMigrate(&User{})createUser(db)findUser(db)updateUser(db)deleteUser(db)transactionExample(db)
}func createUser(db *gorm.DB) {user := User{Name: "Alice", Email: "alice@example.com", Age: 25}result := db.Create(&user)if result.Error != nil {panic(result.Error)}fmt.Println("User created:", user.ID)
}func findUser(db *gorm.DB) {var user Userresult := db.First(&user, "email = ?", "alice@example.com")if result.Error != nil {panic(result.Error)}fmt.Println("Found user:", user)
}func updateUser(db *gorm.DB) {var user Userdb.First(&user, "email = ?", "alice@example.com")db.Model(&user).Update("Age", 30)fmt.Println("Updated user:", user)
}func deleteUser(db *gorm.DB) {var user Userdb.First(&user, "email = ?", "alice@example.com")db.Delete(&user)fmt.Println("Deleted user:", user)
}func transactionExample(db *gorm.DB) {tx := db.Begin()defer func() {if r := recover(); r != nil {tx.Rollback()}}()user1 := User{Name: "Bob", Email: "bob@example.com", Age: 30}if err := tx.Create(&user1).Error; err != nil {tx.Rollback()panic(err)}user2 := User{Name: "Charlie", Email: "charlie@example.com", Age: 35}if err := tx.Create(&user2).Error; err != nil {tx.Rollback()panic(err)}tx.Commit()fmt.Println("Transaction completed")
}
四、结语
如果逐步看到这里并且同时你已经敲代码进行了实践,那么你可以在项目中进行使用GORM了,恭喜你已经入门初步掌握最基础常用的功能。接下里就是在项目中熟练的使用GROM。
这篇文章就到这里,下期见,拜拜。