项目源码
安装
作为一个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