第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 预加载关联数据 |
六、课后练习
- 定义
Category、Video模型,含外键关联用户和分类 - 用
AutoMigrate自动创建这两张表 - 写一个上传视频的 handler,写入 title/url/category_id/当前用户
- 用
Preload("Category")查出视频列表并带出分类名 - 在模板中展示视频标题、封面、分类、作者
- 思考:视频文件和数据库记录如何配合(文件存磁盘/对象存储,库里只存 url)?