青训营实践笔记1 GORM数据库操作 | 青训营

65 阅读2分钟

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
}