先附上gorm框架中文文档
GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
安装
- 安装 GORM:使用 Go 的包管理器安装 GORM 包。可以使用以下命令安装最新版本的 GORM:
go get -u gorm.io/gorm
- 可以import导入gorm包后在控制台执行如下指令自动添加依赖
go mod tidy
连接
- 以Mysql为例实现数据库连接,导入所需的包,在 Go 代码中导入 GORM 和 MySQL 驱动程序的包:
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
- 配置数据库连接:创建一个 GORM 的数据库连接实例,并指定 MySQL 数据库的连接信息,如主机地址、端口号、用户名、密码和数据库名称等。
dsn := "user:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("Failed to connect to database")
}
上述参数分别代表:"user":用户名(大多为root)、"password":密码、"host":地址(默认localhost或127.0.0.1)、"port":端口号 、"dbname":数据库名,将上述信息替换为实际的数据库连接信息。
- 定义模型结构:创建一个结构体来定义数据库表的模型。每个字段都对应表中的一列。
type User struct {
ID uint `gorm:"primaryKey"`
Name string
Age int
}
- 迁移数据表:使用 GORM 的 AutoMigrate 函数将会在创建数据时自动创建数据库表,默认的表名是根据驼峰命名添加下划线并且大写全部转为小写,在名字最后加s。
User : users
aBcDeF : a_bc_de_f
err = db.AutoMigrate(&User{})
if err != nil {
panic("Failed to migrate database")
}
- 自定义表名
func (表名) TableName() string {
return "自定义表名"
}
增加
在 GORM 中创建数据记录通常使用 Create 方法。
-
定义模型结构:在 GORM 中,数据表对应着模型结构体。你需要定义一个结构体来映射数据库表,并在结构体的字段中定义表的列。示例代码:
type User struct { ID uint `gorm:"primaryKey"` Name string Age int }
在上述示例中,定义了一个名为 User 的结构体,其字段对应了数据库表的列,利用 `` 标签指定ID为主键。
-
创建数据记录:使用 GORM 的
Create方法创建数据记录。可以创建一个对应模型的实例,并将其传递给Create方法来插入一条记录。示例代码:user := User{Name: "John", Age: 30} db.Create(&user)在上述示例中,创建了一个名为
user的User结构体实例,并使用Create方法将其插入到数据库中。 -
批量创建数据:如果你有多个数据记录需要创建,你可以使用 GORM 的
Create方法与切片结合使用,一次性插入多条记录。示例代码:users := []User{ {Name: "John", Age: 30}, {Name: "Jane", Age: 25}, {Name: "Bob", Age: 35}, } db.Create(&users)
在上述示例中,创建了一个 User 结构体的切片,并使用 Create 方法将所有记录插入到数据库中。
查找
-
查询单条记录:
使用First方法可以从数据库中查询符合条件的第一条记录。你需要传递一个模型实例作为参数,该实例将被填充为查询结果。示例代码:var user User db.First(&user)在上述示例中,从数据库中查询第一条记录,并将结果填充到
user变量中。 -
查询多条记录:
使用Find方法可以从数据库中查询符合条件的所有记录。你需要传递一个切片作为参数,该切片将被填充为查询结果。示例代码:var users []User db.Find(&users)在上述示例中,从数据库中查询所有记录,并将结果填充到
users切片中。 -
条件查询:
使用Where方法可以对查询进行条件过滤。你需要传递一个条件表达式作为参数,该表达式描述了你想要匹配的条件。示例代码:var users []User db.Where("age > ?", 25).Find(&users)在上述示例中,查询年龄大于 25 岁的所有用户。
-
排序查询:
使用Order方法可以对查询结果进行排序。你需要传递排序表达式作为参数,该表达式描述了你想要按照哪个字段进行排序。示例代码:var users []User db.Order("age desc").Find(&users)在上述示例中,我们按照年龄降序对用户进行排序。
-
查询单个字段:
使用Pluck方法可以查询数据库中的单个字段,并将结果填充到切片中。示例代码:var ages []int db.Model(&User{}).Pluck("age", &ages)在上述示例中,查询了所有用户的年龄,并将结果填充到
ages切片中。
修改
-
更新记录(Update): 使用
Model和Update方法来更新数据库中的记录。你需要指定要更新的模型实例以及要更新的字段和值。示例代码:// 更新单个字段 db.Model(&user).Update("Name", "Bob") // 更新多个字段 db.Model(&user).Updates(User{Name: "Bob", Age: 35})
删除
-
删除记录(Delete): 使用
Delete方法从数据库中删除记录。你可以传递要删除的模型实例或使用条件指定要删除的记录。示例代码:// 删除指定记录 db.Delete(&user) // 使用条件删除记录 db.Where("age < ?", 30).Delete(&User{})
删除操作同样可以使用Where来指定删除数据
问题记录
报错:unsupported relations for schema
type Profile struct {
ID uint `gorm:"primaryKey"`
u User
}
上述结构体是一个嵌套结构体,在Profile中嵌套了User结构体,当在执行创建查找等相关操作时,都需要用Preload先将嵌套的表预加载,预加载Preload()的参数是结构体的字段名称,而不是表名,如果写成了表名就会报unsupported relations for schema错误。
//错误的的写法
db.Preload("User").***
//正确的写法
db.Preload("u").***
利用结构体返回json数据是可以利用标签决定是否返回
type User struct {
ID int `json:"id"`
Password int `json:"-"`
}
上述代码中返回格式如下
{id:一串数字}
向数据库存储存储路径时 '\' 变成 '/'
转换路径时,如下方法会自动进行符号的转换
filepath.Join("./public/", finalName)
应当使用如下方法,存储之后为字符串
fmt.Sprintf("./public/%s", finalName)
MySQL数据表清空后主键还是从之前的递增值开始增加
truncate table 表名;
即可重置主键id从1开始自增