第36讲 GORM使用
本讲基于视频实际讲解内容整理
一、本讲概述
前面我们用原生 SQL 建表、插数据。本讲引入 GORM——Go 最流行的 ORM(对象关系映射)库。它让我们用操作结构体的方式操作数据库,不用手写大量 SQL。本讲讲解连接 PostgreSQL、定义模型、自动建表,以及基本的增删改查。
二、安装 GORM
Shell
go get gorm.io/gorm
go get gorm.io/driver/postgres
三、连接数据库
3.1 拼接 DSN 并打开
Go
import (
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
func initDB() *gorm.DB {
dsn := "host=localhost user=admin password=123456 dbname=bbs port=5432 sslmode=disable"
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
panic("数据库连接失败: " + err.Error())
}
return db
}
| DSN 字段 | 说明 |
|---|---|
host |
数据库地址(Docker 映射到本机用 localhost) |
user/password |
用户名、密码 |
dbname |
数据库名 |
port |
端口 5432 |
sslmode=disable |
开发环境关闭 SSL 校验 |
老师强调:连接失败多半是 DSN 写错(密码、库名、端口)。开发阶段
sslmode=disable即可。
四、定义模型(结构体 + 标签)
4.1 模型对应表
GORM 用结构体表示表,用 gorm 标签配置字段:
Go
type User struct {
ID uint `gorm:"primaryKey"`
Username string `gorm:"size:50;uniqueIndex"`
Password string `gorm:"size:100"`
CreatedAt time.Time
}
type Post struct {
ID uint `gorm:"primaryKey"`
Title string `gorm:"size:200"`
Content string
UserID uint
CreatedAt time.Time
}
| 标签 | 作用 |
|---|---|
gorm:"primaryKey" |
主键 |
gorm:"size:50" |
字段长度 |
gorm:"uniqueIndex" |
唯一索引 |
字段名 ID |
GORM 默认识别为自增主键 |
老师说明:结构体名
User默认对应表名users(复数)。字段ID自动当主键且自增。这和第35讲建的表能对上。
4.2 自动建表(AutoMigrate)
Go
db.AutoMigrate(&User{}, &Post{})
AutoMigrate会自动创建表(不存在时),或追加新字段(不会删字段/改类型)。比手写CREATE TABLE省事,开发阶段很方便。
五、增删改查(CRUD)
5.1 增(Create)
Go
user := User{Username: "张三", Password: "密文"}
db.Create(&user) // 插入后,user.ID 会被自动填上
5.2 查(Read)
Go
var u User
db.First(&u, 1) // 查 id=1
db.Where("username = ?", "张三").First(&u) // 条件查询
db.Find(&users) // 查所有
// 连表:查帖子时带出作者
var post Post
db.Preload("User").First(&post, 1)
5.3 改(Update)
Go
db.Model(&u).Update("username", "新名字") // 改单个字段
db.Model(&u).Updates(User{Username: "x", Password: "y"}) // 改多个
5.4 删(Delete)
Go
db.Delete(&u) // 按主键删除
db.Where("id = ?", 1).Delete(&User{})
5.5 在 controller 中使用
把 *gorm.DB 传给 handler(或通过包级变量),就能在登录、发帖时操作数据库:
Go
var DB *gorm.DB
func Login(c *gin.Context) {
var u User
db := DB.Where("username = ?", c.PostForm("username")).First(&u)
// ...校验密码
}
六、本讲小结
| 知识点 | 要点 |
|---|---|
| 安装 | gorm.io/gorm + gorm.io/driver/postgres |
| 连接 | gorm.Open(postgres.Open(dsn), &gorm.Config{}) |
| 模型 | 结构体 + gorm 标签,表名默认复数 |
| 自增主键 | 字段名 ID 自动识别 |
| 建表 | db.AutoMigrate(&User{}, &Post{}) |
| CRUD | Create / First·Find / Update / Delete |
七、课后练习
- 安装 GORM 及 postgres 驱动,连接第34讲启动的 PostgreSQL
- 定义
User、Post模型,用AutoMigrate自动建表 - 用
db.Create插入一条用户,观察ID自动生成 - 用
First/Where/Find实现按 id 查、按用户名查、查全部 - 用
Update修改某用户字段,Delete删除一条记录 - 把
DB设为包级变量,在登录 handler 里用它查询用户