安装和配置gorm过程中遇到的问题

安装

1
2
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

快速入门

泛型 API (>= v1.30.0)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package main

import (
"context"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)

type Product struct {
gorm.Model
Code string
Price uint
}

func main() {
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("连接数据库失败")
}

ctx := context.Background()

// 自动建表
db.AutoMigrate(&Product{})

// 创建
err = gorm.G[Product](db).Create(ctx, &Product{Code: "D42", Price: 100})

// 查询
product, err := gorm.G[Product](db).Where("id = ?", 1).First(ctx) // 查找对应主键的产品
products, err := gorm.G[Product](db).Where("code = ?", "D42").Find(ctx) // 查找 code 为 D42 的所有产品

// 更新 - 将产品价格更新为 200
err = gorm.G[Product](db).Where("id = ?", product.ID).Update(ctx, "Price", 200)
// 更新 - 更新多个字段
err = gorm.G[Product](db).Where("id = ?", product.ID).Updates(ctx, Product{Code: "D42", Price: 100})

// 删除 - 删除产品
err = gorm.G[Product](db).Where("id = ?", product.ID).Delete(ctx)
}

传统 API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package main

import (
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)

type Product struct {
gorm.Model
Code string
Price uint
}

func main() {
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("连接数据库失败")
}

// 自动建表
db.AutoMigrate(&Product{})

// 创建
db.Create(&Product{Code: "D42", Price: 100})

// 查询
var product Product
db.First(&product, 1) // 查找对应主键的产品
db.First(&product, "code = ?", "D42") // 查找 code 为 D42 的所有产品

// 更新 - 将产品价格更新为 200
db.Model(&product).Update("Price", 200)
// 更新 - 更新多个字段
db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零字段
db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})

// 删除 - 删除产品
db.Delete(&product, 1)
}

更换代理

1
2
go env -w GOPROXY=https://goproxy.cn,direct
go env -w GOSUMDB=sum.golang.org

这是国内最稳定的代理

输入

1
go env GOPROXY

如果输出的是 https://goproxy.cn,direct,说明配置已经彻底生效,你现在可以放心地去敲 go mod tidy 或者 go get 下载依赖,不会再出现 404 报错了!

如果有报错的话,大概率是环境变量已经在系统环境变量那边写死了,你得去那边找到GOPROXY环境变量然后修改掉

go mod tidy作用

go mod tidy 是 Go 语言项目的 “依赖管家”

结合你刚刚换好代理的环境,现在执行它非常合适。简单来说,它的核心作用是让你的 go.modgo.sum 文件跟你的实际代码完全保持一致

它可以帮你自动做以下 3 件具体的事

1. 自动“补货”(添加缺失的包)

如果你在代码里写了 import "gorm.io/gorm",但是 go.mod 文件里还没有这个包,go mod tidy 就会自动帮你把这个包的最新兼容版本加进去,并下载到本地

2. 自动“扔垃圾”(移除没用的包)

如果你以前测试时下载了某个包,后来代码里删掉了,但 go.mod 里还留着记录。执行 go mod tidy,它会自动把多余、没用的依赖删掉,保持 go.mod 文件非常干净。

3. 生成加密校验(更新 go.sum

除了写进 go.mod,它还会把下载的包的版本哈希值写入 go.sum 文件。这个文件的作用是保证你项目里的依赖包绝对安全、没被篡改过

实操建议(代替 go get

很多新手喜欢用 go get -u gorm.io/gorm,这很容易因为网络原因或者版本混乱报 404 错误。

最佳实践是:

  1. 在你的代码编辑器(比如 GoLand)里,直接在 main.go 或者别的 .go 文件里敲下:
    1
    import "gorm.io/gorm"
  2. 保存文件后,直接在终端执行:
    1
    go mod tidy

原理go mod tidy 会扫描你写好的所有代码,由 Go 编译器自己去判断应该用哪个版本最好,而不是你靠直觉手动去指定。这样下载下来的依赖最稳定,也不会踩到 +incompatible 这种老版本的坑。

所以,现在换好代理之后,直接执行 go mod tidy 就能立刻解决你的 GORM 下载问题!