首先我们需要了解一下gorm的约定
约定
GORM 倾向于约定优于配置 默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间
注意结构体字段的首字母需要大写,小写不能导入
如果您遵循 GORM 的约定,您就可以少写的配置、代码。 如果约定不符合您的实际要求,GORM 允许你配置它们。
蛇形约定:可以看到之前我们创建的struct是type Product struct,而在数据库生成的表名为products
图片出处:原文链接:blog.csdn.net/qq23001186/…
- gorm.Model:GORM 定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt
-
- 可以自定义TAG,如gorm:"primaryKey" -> 主键;gorm:"index" -> 索引
// gorm.Model 的定义
type Model struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
连接MYSQL数据库
首先,我们需要有一个数据库,我的数据库是MYSQL 8.0.33
可在官网上自行下载
同时,我采用Navicat Premium 15图形化界面辅助来观测数据库
此处省略下载这两个软件的步骤,以及连接这两个软件的步骤
下面我们在Navicat Premium 15软件中新建一个数据库
右键新建的连接显示如下:->点击新建数据库
输入数据库名字:gorm_class,以及选择编码方式utf8mb4,不用输入排序规则,点击确认即可
如图为建立成功的标志:
在终端运行
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
然后就可以import导入了
将下面代码账号密码和数据库名改成自己设置的,运行代码即可成功连接上数据库
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
//配置MySQL连接参数
username := "root" //账号
password := "123456" //密码
host := "127.0.0.1" //数据库地址,可以是Ip或者域名
port := 3306 //数据库端口
Dbname := "gorm_class" //数据库名
timeout := "10s" //连接超时,10秒
//拼接下dsn参数, dsn格式可以参考上面的语法,这里使用Sprintf动态拼接dsn参数,因为一般数据库连接参数,我们都是保存在配置文件里面,需要从配置文件加载参数,然后拼接dsn。
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
_, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("连接数据库失败, error=" + err.Error())
}
}
注意上文出现的变量如果下文不用就会报错,即上文的_变成其他字母变量
连接数据库失败的结果
连接数据库成功
实现增删改查
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// 定义表机构类型的结构体
// 跟表对应的字段,注意结构体字段的首字母需要大写,小写不能导入
type User struct {
//gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt
gorm.Model
Username string
Email string
}
func main() {
//配置MySQL连接参数
username := "root" //账号
password := "123456" //密码
host := "127.0.0.1" //数据库地址,可以是Ip或者域名
port := 3306 //数据库端口
Dbname := "gorm_class" //数据库名
timeout := "10s" //连接超时,10秒
//拼接下dsn参数, dsn格式可以参考上面的语法,这里使用Sprintf动态拼接dsn参数,因为一般数据库连接参数,我们都是保存在配置文件里面,需要从配置文件加载参数,然后拼接dsn。
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("连接数据库失败, error=" + err.Error())
}
//延时关闭数据库连接
//defer db.Close()
// 创建表和进行迁移
db.AutoMigrate(&User{})
// 创建记录
createUser(db, "uuuuu", "jiaojiao@example.com")
// 查询记录
user, err := getUserByID(db, 1)
if err != nil {
panic(err)
}
fmt.Println(user.Username, user.Email)
// 更新记录
err = updateUserEmail(db, 1, "newemail@example.com")
if err != nil {
panic(err)
}
// 删除记录
err = deleteUser(db, 1)
if err != nil {
panic(err)
}
}
func createUser(db *gorm.DB, name, email string) {
user := User{Username: name, Email: email}
db.Create(&user)
}
// 第一个括号表示传入的数据,第二个括号表示要返回的数据
func getUserByID(db *gorm.DB, id uint) (User, error) {
var user User
result := db.First(&user, id)
if result.Error != nil {
return user, result.Error
}
return user, nil
}
func updateUserEmail(db *gorm.DB, id uint, email string) error {
user, err := getUserByID(db, id)
if err != nil {
return err
}
user.Email = email
result := db.Save(&user)
return result.Error
}
func deleteUser(db *gorm.DB, id uint) error {
result := db.Delete(&User{}, id)
return result.Error
}
运行结果:
查看Navicat Premium 15,自动新建users数据库,成功!