一般通用示例代码:
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type Product struct {
gorm.Model
Code string
Price uint
}
func main() {
// 连接数据库
dsn := "user:pass@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(&Product{})
// 增
db.Create(&Product{Code: "D42", Price: 100})
// 改
var product Product
db.First(&product, 1) // 查找ID=1的product
product.Price = 200
db.Save(&product) // 保存修改
// 删
db.Delete(&product, 1) // 删除ID=1的product
// 查
var products []Product
db.Find(&products) // 查找全部
for _, p := range products {
println(p.Code)
}
}
主要步骤:
-
使用mysql.Open连接数据库
-
使用gorm.Open并传入配置初始化ORM
-
使用AutoMigrate自动创建表
-
通过Create、Save、Delete等方法实现增删改
-
通过First、Find等方法查询数据
更详细的文字说明:
- 导入需要的包:
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
这里导入了gorm.io/driver/mysql,它包含了gorm连接MySQL数据库的驱动。 还导入了gorm.io/gorm,它是GORM库的主包。
- 定义模型结构体:
type Product struct {
gorm.Model
Code string
Price uint
}
这里通过嵌入gorm.Model Anonymous Field来包含一些ORM需要的默认字段,然后定义了业务字段Code和Price。 3. 连接数据库:
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
构建数据库连接DSN,然后通过mysql.Open()打开连接,最后使用gorm.Open()与数据库建立会话。 4. 自动创建表:
db.AutoMigrate(&Product{})
根据模型结构自动创建对应的数据库表。 5. CRUD操作:
- Create:
db.Create(&Product{...}) - Read:
db.First(&product, id) - Update:
db.Save(&product) - Delete:
db.Delete(&product, id)通过调用简单的方法即可执行相应的SQL。 GORM使得Go语言实现ORM非常简单,可以大大减少编写SQL语句的工作量。充分利用GORM提供的各种方法可以快速实现强大的CRUD功能
字节青训营项目中实践应用示例
我负责项目的点赞操作和喜欢列表,我以赞操作的DAO文件和MySQL的配置文件作为实践应用示例:
MySql.go文件
实现了创建GORM连接MYSQL数据库的功能,主要分以下几步:
- 导入需要的包,包括数据库驱动mysql,GORM库以及配置和日志包。
- 定义了全局变量GORM用于保存GORM的DB对象。
- 创建CreateGORMDB方法,这个方法用来创建和初始化GORM的DB对象。
- 在方法内部使用gorm.Open打开连接,传入mysql.Open()返回的底层连接信息以及gorm的配置。
- 获取底层连接db.DB(),设置最大连接数、最大空闲连接数和连接最大生存时间,控制连接池。
- 将db赋值给全局变量GORM,供后续使用。
- 创建GetMysqlDB方法,该方法返回全局GORM,供外部获取使用。 这样通过CreateGORMDB初始化全局的GORM DB对象,在需要使用数据库的地方,只需要调用GetMysqlDB获取已经建立好的连接实例即可,避免重复创建连接。 这实现了数据库连接的单例模式,可以重用连接池,提高效率。同时连接参数可配置,兼顾灵活性。 通过封装,外部只需要简单调用GetMysqlDB即可开始使用GORM调用数据库。
//MySql.go
package db
import (
"TinyTikTok/config"
"gorm.io/driver/mysql" "gorm.io/gorm" "log" "time")
var GORM *gorm.DB
func CreateGORMDB() {
db, err := gorm.Open(mysql.Open(config.Config.Mysql), &gorm.Config{})
if err != nil {
log.Println("gorm Init Error : ", err)
}
sqlDb, _ := db.DB()
sqlDb.SetMaxOpenConns(100) // 连接池最大打开连接数
sqlDb.SetMaxIdleConns(25) // 连接池最大空闲连接数
sqlDb.SetConnMaxLifetime(1 * time.Minute) // 最大生存时间
GORM = db // 赋值给全局变量 GORM}
// GetMysqlDB 需要使用数据库的时候直接创建一个连接 调用此方法即可
func GetMysqlDB() *gorm.DB {
return GORM
}
FavoriteDAO.go
这些代码是实现对Favorite表进行数据库操作的DAO层,主要包含了以下3个函数:
- AddFavorite函数用来新增一个点赞记录,它调用db包的GetMysqlDB获取数据库连接,然后使用Create新增传递的参数favorite模型,并返回记录的id和error。
- UpdateFavorite函数用来更新一个点赞记录,它使用Model指定更新的模型,Where指定更新条件,然后调用Update执行update查询,最后返回error。
- GetFavorite函数用来根据用户id和视频id查询点赞记录,它使用Where构造查询条件,Find查询并填充结果到favorite模型,最后返回favorite对象和error。 可以看出,这些函数实现了对Favorite表的增删改查操作。 主要逻辑是利用db包中的连接,调用gorm的各种方法如Create、Update、Where、Find等操作数据库。 这样可以把数据库操作集中到dao层,外部调用只需要传入模型或条件,非常简洁;而数据库的连接创建、连接池等细节都封装在db包中,DAO层只需要简单调用GetMysqlDB()获取数据库连接实例;这实现了典型的分层设计,提高了代码的复用性和可维护性。
//FavoriteDAO.go
package dao
import (
"TinyTikTok/db"
"TinyTikTok/models")
// AddFavorite 添加点赞数据
func AddFavorite(favorite models.Favorite) (int64, error) {
result := db.GetMysqlDB().Create(&favorite)
return favorite.Id, result.Error
}
// UpdateFavorite 更新点赞数据
func UpdateFavorite(favorite models.Favorite) error {
result := db.GetMysqlDB().Model(&models.Favorite{}).
Where("id = ?", favorite.Id).
Update("is_favorite", favorite.IsFavorite)
return result.Error
}
// GetFavorite 根据userId和videoId获取点赞数据
func GetFavorite(userId int64, videoId int64) (models.Favorite, error) {
var favorite models.Favorite
result := db.GetMysqlDB().
Where("user_id = ? AND video_id = ? AND is_deleted <> 1", userId, videoId).
Find(&favorite)
return favorite, result.Error
}