手把手带你从0到1封装Gin框架:05 数据库初始化

项目源码

Github

安装

作为一个web框架,数据库是不可或缺的,本篇我们封装一下数据库

和其他语言一样,Golang也有很多ORM框架,这里我们选用比较受欢迎的 GORM 框架

shell 复制代码
go get gorm.io/gorm
go get gorm.io/driver/mysql

GORM支持mysql、sqlite、postgres、sqlserver四种数据库,这里我们使用mysql

配置文件

首先定义配置文件internal/config/database.go:

go 复制代码
package config

type Database struct {
	Host     string
	Port     string
	Username string
	Password string
	Database string
	Charset  string
}

Database添加到internal/config/config.go中:

go 复制代码
...
// Config 配置文件集合
type Config struct {
	App      App
	Database Database
}
...

然后再在config.yaml文件中新增数据库配置

yaml 复制代码
database:
  host: 127.0.0.1
  port: 3306
  database: eve
  username: root
  password: 12345678
  charset: utf8mb4

*配置的值请根据自己的开发环境填写,这里是笔者自己本地的配置

初始化数据库

创建internal/mysql/mysql.go文件:

go 复制代码
package mysql

import (
	"eve/internal/global"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	"log"
)

func GetConnection() (db *gorm.DB) {
	// 获取数据库配置
	config := global.Config.Database

	// 拼装dsn
	dsn := config.Username + ":" + config.Password + "@tcp(" + config.Host + ":" + config.Port + ")/" + config.Database + "?charset=" + config.Charset + "&parseTime=True&loc=Local"

	// 初始化配置
	mysqlConfig := mysql.Config{
		DSN: dsn,
	}

	// 连接数据库
	db, err := gorm.Open(mysql.New(mysqlConfig), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true, // 禁用表名复数
		},
	})
	if err != nil {
		log.Println("数据库链接失败:", err)
		panic(err)
	}

	return
}

然后在internal/bootstrap/init.go文件中调用GetConnection方法来初始化数据库:

go 复制代码
package bootstrap

import (
	"eve/internal/config"
	"eve/internal/global"
	"eve/internal/mysql"
)

func init() {
	// 初始化配置文件
	global.Config = config.GetConfig()

	// 初始化数据库
	global.Db = mysql.GetConnection()
}

创建数据库eve并等项目重启之后登陆数据库并执行show processlist;

shell 复制代码
mysql> show processlist;
+----+------+-----------------+------+---------+------+----------+------------------+
| Id | User | Host            | db   | Command | Time | State    | Info             |
+----+------+-----------------+------+---------+------+----------+------------------+
| 36 | root | localhost:53096 | eve  | Sleep   |  654 |          | NULL             |
| 40 | root | localhost       | NULL | Query   |    0 | starting | show processlist |
+----+------+-----------------+------+---------+------+----------+------------------+
2 rows in set (0.00 sec)

可以看到当前数据库有两个连接,一个是当前客户端,db为null,另一个db为eve的就是我们的eve项目所创建的连接

测试

首先我们在eve数据库创建一个数据库表并新增一条数据:

sql 复制代码
CREATE TABLE `admin` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) NOT NULL DEFAULT '',
  `password` char(64) NOT NULL DEFAULT '',
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;;

INSERT INTO `admin` (`id`, `name`, `password`, `created_at`, `updated_at`) VALUES
(1, '管理员', 'NOEFNIE', '2024-07-15 15:12:26', '2024-07-15 16:01:08');

创建app/model/admin.go文件:

go 复制代码
package model

type Admin struct {
	ID        uint   `json:"id" gorm:"primary_key" json:"id"`
	Name      string `json:"name" gorm:"column:name;type:varchar(64);"`
	Password  string `json:"password" gorm:"column:password;type:varchar(64);"`
	CreatedAt string `json:"created_at" gorm:"column:created_at;type:datetime;"`
	UpdatedAt string `json:"updated_at" gorm:"column:updated_at;type:datetime;"`
}

然后修改internal/bootstrap/init.go文件:

go 复制代码
package bootstrap

import (
	"eve/app/model"
	"eve/internal/config"
	"eve/internal/global"
	"eve/internal/mysql"
	"fmt"
)

func init() {
	// 初始化配置文件
	global.Config = config.GetConfig()

	// 初始化数据库
	global.Db = mysql.GetConnection()

	var adminList model.Admin
	global.Db.First(&adminList)
	fmt.Println(adminList)
}

在init方法最后新增3行测试代码,用来查询数据admin表的第一条数据并输出,保存文件之后可以看到控制台上有输出:

shell 复制代码
internal/bootstrap/init.go has changed
building...
running...
{1 管理员 NOEFNIE 2024-07-15T15:12:26+08:00 2024-07-15T16:01:08+08:00}
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /admin/a                  --> eve/app/route.genAdminRouter.func1 (1 handlers)
[GIN-debug] GET    /app/b                    --> eve/app/route.genAppRouter.func1 (1 handlers)

说明数据库连接和查询都没问题了,init方法中新增的3行测试代码可以删除了,后续我们会进一步讲解GORM的用法

总结

  • gorm安装
  • 新增数据库配置
  • 初始化数据库连接

commit-hash: 9ffee1c

相关推荐
0x派大星2 天前
【Golang】——Gin 框架中的 API 请求处理与 JSON 数据绑定
开发语言·后端·golang·go·json·gin
get2002 天前
Gin 框架中间件详细介绍
中间件·gin
bigbig猩猩2 天前
Gin 框架中的表单处理与数据绑定
驱动开发·gin
荣~博客3 天前
Golang语言整合jwt+gin框架实现token
开发语言·golang·gin
拧螺丝专业户3 天前
gin源码阅读(2)请求体中的JSON参数是如何解析的?
前端·json·gin
留乘船3 天前
使用gin -gorm-jwt-中间件拦截的一个小项目
开发语言·学习·中间件·golang·gin
0x派大星5 天前
【Golang】——Gin 框架中的模板渲染详解
开发语言·后端·golang·go·gin
0x派大星5 天前
【Golang】——Gin 框架中的表单处理与数据绑定
开发语言·后端·golang·go·gin
杜杜的man5 天前
【go从零单排】gin+gorm理解及实现CRUD
开发语言·golang·gin
杨若瑜6 天前
Go语言24小时极速学习教程(五)Go语言中的SpringMVC框架——Gin
学习·golang·gin