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

《笔记》第三十五篇 GORM使用

第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

七、课后练习

  1. 安装 GORM 及 postgres 驱动,连接第34讲启动的 PostgreSQL
  2. 定义 User、Post 模型,用 AutoMigrate 自动建表
  3. 用 db.Create 插入一条用户,观察 ID 自动生成
  4. 用 First / Where / Find 实现按 id 查、按用户名查、查全部
  5. 用 Update 修改某用户字段,Delete 删除一条记录
  6. 把 DB 设为包级变量,在登录 handler 里用它查询用户