💜 想真正擅长编程? 从一门课程开始,100% 免费

《笔记》第三十八篇 创建视频关联的数据库

第39讲 创建视频关联的数据库

本讲基于视频实际讲解内容整理


一、本讲概述

BBS 不止有图文帖子,还要支持视频。本讲设计"视频"相关的数据表:视频表、分类表,并把视频与上传用户、所属分类关联起来,然后用 GORM 的 AutoMigrate 自动建表。


二、设计数据表

2.1 分类表 category

SQL
CREATE TABLE categories (
    id   SERIAL PRIMARY KEY,
    name VARCHAR(50) NOT NULL
);
Go
type Category struct {
    ID   uint   `gorm:"primaryKey"`
    Name string `gorm:"size:50"`
}

2.2 视频表 video

SQL
CREATE TABLE videos (
    id          SERIAL PRIMARY KEY,
    title       VARCHAR(200) NOT NULL,
    url         VARCHAR(500),
    cover       VARCHAR(500),
    user_id     INTEGER REFERENCES users(id),
    category_id INTEGER REFERENCES categories(id),
    created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Go
type Video struct {
    ID        uint   `gorm:"primaryKey"`
    Title     string `gorm:"size:200"`
    Url       string `gorm:"size:500"`
    Cover     string `gorm:"size:500"`
    UserID    uint
    CategoryID uint
    CreatedAt time.Time
}

老师说明:video 通过 user_id 关联作者、category_id 关联分类。这就是"视频关联的数据库"——把视频、用户、分类三张表用外键串起来。


三、AutoMigrate 建表

Go
DB.AutoMigrate(&User{}, &Post{}, &Category{}, &Video{})

一次性把所有模型交给 GORM,它会自动创建不存在的表(videos、categories),已有表则跳过。开发阶段改模型后重新跑即可。


四、插入与查询视频

4.1 上传视频(写入)

Go
func UploadVideo(c *gin.Context) {
    title := c.PostForm("title")
    url   := c.PostForm("url")
    catID := c.PostForm("category_id")

    video := Video{
        Title:     title,
        Url:       url,
        UserID:    getUserID(c),           // 从 session 取当前用户
        CategoryID: parseUint(catID),
    }
    DB.Create(&video)
    c.JSON(200, common.Success("上传成功", nil))
}

4.2 带分类查询

Go
var videos []Video
DB.Preload("Category").Preload("User").Find(&videos)

Preload 会把关联的分类、作者一起查出来,模板里就能直接用 video.Category.Name、video.User.Username。


五、本讲小结

知识点 要点
分类表 categories(id, name)
视频表 videos(含 user_id、category_id 外键)
关联 视频↔用户、视频↔分类
建表 AutoMigrate(&Video{}, &Category{})
查询 Preload 预加载关联数据

六、课后练习

  1. 定义 Category、Video 模型,含外键关联用户和分类
  2. 用 AutoMigrate 自动创建这两张表
  3. 写一个上传视频的 handler,写入 title/url/category_id/当前用户
  4. 用 Preload("Category") 查出视频列表并带出分类名
  5. 在模板中展示视频标题、封面、分类、作者
  6. 思考:视频文件和数据库记录如何配合(文件存磁盘/对象存储,库里只存 url)?