Gin框架系列教程(6)- 连接Mysql,集成Gorm库

本文主要是了解一下Gin框架如何链接MySQL并集成Gorm库的。当然ORM库有很多,虽然gorm库被很多人吐槽,但是并不能否认它很强大,很完善,用的人最多。当然你也可以用其他的库。

介绍:

Object-Relationl Mapping,即对象关系映射,这里的Relationl指的是关系型数据库,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了,Golang写的,GitHub上活跃度很高的orm库。

特点:

  • 全功能ORM(几乎)
  • 关联(包含一个,包含多个,属于,多对多,多种包含)
  • Callbacks(创建/保存/更新/删除/查找之前/之后)
  • 预加载(急加载)
  • 事务
  • 复合主键
  • SQL Builder
  • 自动迁移
  • 日志
  • 可扩展,编写基于GORM回调的插件
  • 每个功能都有测试
  • 开发人员友好


安装:

go get gorm.io/driver/mysql
go get gorm.io/gorm

链接MySQL,迁移数据库,我这里用的是viper解析yaml文档,配置数据库的信息(就直接展示代码):

链接并配置:

config.yaml

mysql:
  db_username: "root"
  db_password: "root"
  db_database: "demo_database"
  db_host: "127.0.0.1"
  db_port: "3306"
logs:
  log_level: "debug"

base.go

package models

import (
	"time"

	"github.com/spf13/viper"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var DB *gorm.DB
var err error

func Init() {
	//读取配置
	viper.SetConfigFile("config/config.yaml")
	errConfi := viper.ReadInConfig()
	if errConfi != nil {
		panic(errConfi)
	}
	db_username := viper.GetString("mysql.db_username")
	db_password := viper.GetString("mysql.db_password")
	db_database := viper.GetString("mysql.db_database")
	db_host := viper.GetString("mysql.db_host")
	db_port := viper.GetString("mysql.db_port")
	DB, err = gorm.Open(mysql.New(mysql.Config{
		DSN: db_username + ":" + db_password + "@tcp(" + db_host + ":" + db_port + ")/" + db_database + "?charset=utf8mb4&parseTime=True&loc=Local",
		// DSN data source name
		DefaultStringSize: 256,
		// string 类型字段的默认长度
		DisableDatetimePrecision: true,
		// 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex: true,
		// 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn: true,
		// 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false,
		// 根据当前 MySQL 版本自动配置
	}), &gorm.Config{})
	if err != nil {
		panic(err)
	}
	//迁移数据库,上线之后去掉
	DB.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{}, &Article{}, &ArticleCategory{}, &Role{}, &Menus{})
	sqlDB, _ := DB.DB()
	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(100)
	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(50)
	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	sqlDB.SetConnMaxLifetime(time.Hour)
}

模型下的一个User结构体,用于迁移数据库等:

package models

import (
	"gorm.io/gorm"
)

type User struct {
	gorm.Model
	Mame      string `json:"name" form:"name" gorm:"column:name;comment:姓名;type:varchar(10);"`                           //姓名
	Account   string `json:"account" form:"account" gorm:"column:account;comment:账号;type:varchar(10);"`                  //账号
	Password  string `json:"password" form:"password" gorm:"column:password;comment:密码;type:varchar(32);"`               //密码
	Email     string `json:"email" form:"email" gorm:"column:email;comment:邮箱;type:varchar(300);"`                       //邮箱
	Image     string `json:"image" form:"image" gorm:"column:image;comment:头像;type:varchar(300);"`                       //头像
	IsEnabled int64  `json:"is_enabled" form:"is_enabled" gorm:"column:is_enabled;comment:是否启用;type:smallint;default:1"` //是否启用
}

func (User) TableName() string {
	return "users"
}

最后注册进程序主入口中:

// 数据库初始化
models.Init()


结构如下:

点赞1
点击评论0
收藏1
浏览 130
 

还没有评论,快来发表第一个评论吧

免责声明:凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,注册用户和一般页面游览者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任(包括侵权责任、合同责任和其它责任)
*尊重作者,转载请注明出处!

创作内容

开启你的爱凌峰创作之旅

发布首篇内容,开通创作中心
快来成为爱凌峰创作者吧~

写文章

板块热门【Gin】