go+gorm管理mysql数据库 | 青训营

267 阅读2分钟

本文介绍go语言中gorm框架对mysql数据库的管理,并将其按照项目开发把初始化和关闭数据库连接进行全局封装。以user.go为例

目录结构

  • |——db
  • | |_ db.go //管理数据库连接
  • |——controller
  • | |_ user.go //调用数据库操作
  • |__ main.go

mysql

安装mysql包,包括原生gorm包和改进包,二选一即可

go get gorm.io/gorm
go get github.com/jinzhu/gorm

db.go

引入gorm框架和mysql包

package db

import (
    "github.com/jinzhu/gorm"
    _ "gorm.io/driver/mysql"
    "log"
)

创建全局变量,方便不同controller的方法中调用

var DB *gorm.DB

创建数据库连接方法: 设置数据库DSN(数据来源名称),并利用gorm进行连接 dns中同时可以对数据库连接相关参数进行配置 连接完成后对结构体向数据库进行迁移。经过实践,只能将调用AutoMigrate方法的代码放在InitDB方法中,不能独立出方法如db.DB.InitDB();db.DB.Migrate()(其中包含各种结构体的迁移),否则将报错。

func InitDB() {
    connect := "root:123456@tcp(localhost:3306)/gorm?charset=utf8&parseTime=True&loc=Local"
    db, err := gorm.Open("mysql", connect)
    if err != nil {
       log.Fatal(err)
    }

    DB = db
    DB.AutoMigrate(&model.User{})
}

数据库表进行迁移时,若数据库中不存在该表则会自动生成与实体类对应表 以以下User结构体为例

type User struct {
    Id            int64  `json:"id,omitempty"`       //唯一序号字段
    Username      string `json:"username,omitempty"` //用户名(唯一)
    Name          string `json:"name,omitempty"`     //用户昵称
    FollowCount   int64  `json:"follow_count,omitempty"`
    FollowerCount int64  `json:"follower_count,omitempty"`
    IsFollow      bool   `json:"is_follow,omitempty"`
    Password      string `json:"password,omitempty"` //密码
}

在数据库dsn配置中未启用SingularTable(单数表名)配置时,数据库表名为users(即结构体名+s) 数据库字段名为json序列化名。 且注意结构体开放给其他包使用时,结构体名开头大写,且属性名也需要大写才能映射到。相当于首字母大写为公有属性,首字母小写为私有属性

创建数据库关闭连接方法

func CloseDB() {
    err := DB.Close()
    if err != nil {
       log.Fatal(err)
    }
}

main.go

main.go中导入db包,且main方法中调用管理数据库的方法,实现连接数据库操作

db.InitDB()
defer db.CloseDB()

user.go

调用db.DB全局变量可以对数据库进行操作,例如增删改查

newUser := model.User{Username: username, Name: username, Password: password}
db.DB.Create(&newUser)
db.DB.Last(&newUser)
db.DB.First(&neUuser)
db.DB.Take(&newUser)

user := model.User{}
res := db.DB.Where("username = ?", username).Where("password=?", password).First(&user)

可以直接对实体类变量进行读写

  1. Create:插入该实体类映射的记录。
  • db.Create 函数会返回如下 3 个值:
  • user.ID:返回插入数据的主键,这个是直接赋值给 user 变量。
  • result.Error:返回 error。
  1. First:获取第一条记录(主键)
  2. Last:获取最后一条记录(主键)
  3. Take:获取一条记录,没有指定排序字段
  4. where:条件查询 同时也可以使用链式编程简化代码量,如最后一行的where().where().First 在条件查询中First查询出符合条件的一条记录,Find为多条记录