GORM数据库操作
GORM(Go Object Relational Mapping)是Go语言的一个对象关系映射框架,用于将Go映射到关系型数据库,使得可以用面向对象的方式操作数据库。
数据库的连接和初始化
准备阶段:需要导入gorm的两个包"gorm.io/driver/mysql"和"gorm.io/gorm",并创建*gorm.DB类型的全局变量db,之后所有数据库操作都要在这个数据库指针的基础上进行。
import (
"douyin/models"
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var db *gorm.DB
首先定义数据源名称dsn,包括用户名、口令、主机、端口、数据库名称
func SetupDB() {
username := "username"
password := "password"
host := "host"
port := 3306
dbname := "dbname"
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port, dbname)
mysql.Open(dsn) 使用驱动程序注册名为 "mysql" 的数据库连接;&gorm.Config{}使用默认配置,gorm.Open将连接到的数据库实例赋值给 db
var err error
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("链接数据库失败, error=" + err.Error())
}
下面通过db.AutoMigrate根据models模块下的User, Viedo, Comment, FavoriteCommentRelation. FavoriteVideoRelation, FollowRelation这六个结构体的结构分别在数据库中创建6张空表,名字分别是这六个结构体名小写并在末尾加s,如FavoriteVideoRelation的表名为favorite_video_relations。这样就完成了数据库的初始化
// 将 gorm 设计的表映射到Mysql数据库中
db.AutoMigrate(&models.User{}, &models.Video{}, &models.Comment{}, &models.FavoriteCommentRelation{}, &models.FavoriteVideoRelation{}, &models.FollowRelation{})
}
数据库的增删改查
增:加一条记录到数据库users中,注意数据库名(users)必须只和对象类型名(User)差一个s
// 创建新用户
func CreateUser(newUser *models.User) {
db.Create(newUser)
}
删:gorm使用db.Delete对一条记录删除,需要指定删除对象的主键,否则会批量删除。当表中有deleted_at字段时,gorm会进行软删除,即对记录做了一个标记,记下来了记录删除的时间,并未从数据库中真正删除
//删除一条comment,gorm使用软删除,只是做标记
func DeleteComment(comment models.Comment)error{
result:=db.Delete(&comment)
if result.Error != nil {
return result.Error
}
return nil
}
改:使用db.Model传入一条记录对应的对象,.Where为查询条件,.Update确定字段和值。下面的代码等价于SQL语句UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111 AND active=true;
db.Model(&user).Where("active = ?", true).Update("name", "hello")
查:下面的代码对应的sql语句为select id,play_url,cover_url,favorite_count,comment_count,is_favorite,title from videos where author_id=id。然后使用db.Find将查询列表存储到videoList切片中,注意VideoItem的属性必须和查到的属性相同。这样就成功将数据库中的数据转为go里面的对象
// 根据用户id获取该用户的所有发布视频
func GetVideoListByAuthorId(id int, videoList *[]models.VideoItem) error {
result := db.Table("videos").Select("id,play_url,cover_url,favorite_count,comment_count,if(favorite_count>0,TRUE,FALSE) as is_favorite,title").
Where("author_id", id).Find(videoList)
if result.Error != nil {
return result.Error
}
return nil
}