Explorar el Código

初始化数据库

runningwater hace 1 año
padre
commit
d0957dba23
Se han modificado 6 ficheros con 139 adiciones y 0 borrados
  1. 49 0
      bootstrap/database.go
  2. 32 0
      config/database.go
  3. 7 0
      go.mod
  4. 15 0
      go.sum
  5. 3 0
      main.go
  6. 33 0
      pkg/database/database.go

+ 49 - 0
bootstrap/database.go

@@ -0,0 +1,49 @@
+package bootstrap
+
+import (
+	"errors"
+	"fmt"
+	"time"
+
+	"github.com/runningwater/gohub/pkg/config"
+	"github.com/runningwater/gohub/pkg/database"
+
+	"gorm.io/driver/mysql"
+	"gorm.io/driver/sqlite"
+	"gorm.io/gorm"
+	"gorm.io/gorm/logger"
+)
+
+// SetupDB 初始化数据库和 ORM
+func SetupDB() {
+	var dbConfig gorm.Dialector
+	switch config.GetString("database.connection") {
+	case "mysql":
+		dsn := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=%v&parseTime=True&loc=Local",
+			config.GetString("database.mysql.username"),
+			config.GetString("database.mysql.password"),
+			config.GetString("database.mysql.host"),
+			config.GetString("database.mysql.port"),
+			config.GetString("database.mysql.database"),
+			config.GetString("database.mysql.charset"),
+		)
+		dbConfig = mysql.New(mysql.Config{
+			DSN: dsn,
+		})
+	case "sqlite":
+		// 初始化 SQLite 数据库
+		database := config.GetString("database.sqlite.database")
+		dbConfig =  sqlite.Open(database)
+	default:
+		panic(errors.New("不支持的数据库连接"))
+	}
+
+	// 连接数据库, 并设置 GORM 日志模式
+	database.Connect(dbConfig, logger.Default.LogMode(logger.Info))
+	// 设置最大连接数
+	database.SQLDB.SetMaxOpenConns(config.GetInt("database.mysql.max_open_connections"))
+	// 设置最大空闲连接数
+	database.SQLDB.SetMaxIdleConns(config.GetInt("database.mysql.max_idle_connections"))
+	// 设置连接的最大存活时间
+	database.SQLDB.SetConnMaxLifetime(time.Duration(config.GetInt("database.mysql.max_life_seconds"))* time.Second)
+}

+ 32 - 0
config/database.go

@@ -0,0 +1,32 @@
+package config
+
+import "github.com/runningwater/gohub/pkg/config"
+
+func init() {
+	config.Add("database", func() map[string]any {
+		return map[string]any{
+			// 默认数据库
+			"connection": config.Env("DB_CONNECTION", "mysql"),
+			// MySQL 配置
+			"mysql": map[string]any{
+				// 数据库连接信息,可以使用 DSN 格式
+				"host": config.Env("DB_HOST", "127.0.0.1"),
+				"port": config.Env("DB_PORT", "3306"),
+				"database": config.Env("DB_DATABASE", "gohub"),
+				"username": config.Env("DB_USERNAME", "root"),
+				"password": config.Env("DB_PASSWORD", ""),
+				"charset": "utf8mb4",
+				// 数据库连接池配置
+				"max_idle_connections": config.Env("DB_MAX_IDLE_CONNECTIONS", 100),
+				"max_open_connections": config.Env("DB_MAX_OPEN_CONNECTIONS", 25),
+				// 连接的最大存活时间
+				"max_life_seconds": config.Env("DB_MAX_LIFE_SECONDS", 5*60),
+			},
+			// SQLite 配置
+			"sqlite": map[string]any{
+				// 数据库文件地址
+				"database": config.Env("DB_SQLITE_DATABASE", "database/gohub.db"),
+			},
+		}
+	})
+}

+ 7 - 0
go.mod

@@ -6,6 +6,9 @@ require (
 	github.com/gin-gonic/gin v1.10.0
 	github.com/spf13/cast v1.7.1
 	github.com/spf13/viper v1.20.1
+	gorm.io/driver/mysql v1.5.7
+	gorm.io/driver/sqlite v1.5.7
+	gorm.io/gorm v1.25.12
 )
 
 require (
@@ -19,12 +22,16 @@ require (
 	github.com/go-playground/locales v0.14.1 // indirect
 	github.com/go-playground/universal-translator v0.18.1 // indirect
 	github.com/go-playground/validator/v10 v10.20.0 // indirect
+	github.com/go-sql-driver/mysql v1.7.0 // indirect
 	github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
 	github.com/goccy/go-json v0.10.2 // indirect
+	github.com/jinzhu/inflection v1.0.0 // indirect
+	github.com/jinzhu/now v1.1.5 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
 	github.com/klauspost/cpuid/v2 v2.2.7 // indirect
 	github.com/leodido/go-urn v1.4.0 // indirect
 	github.com/mattn/go-isatty v0.0.20 // indirect
+	github.com/mattn/go-sqlite3 v1.14.22 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/pelletier/go-toml/v2 v2.2.3 // indirect

+ 15 - 0
go.sum

@@ -27,6 +27,8 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn
 github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
 github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8=
 github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
+github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
+github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
 github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=
 github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
 github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
@@ -34,6 +36,10 @@ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG
 github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
+github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
@@ -48,6 +54,8 @@ github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
 github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
 github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
 github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
+github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -112,5 +120,12 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo=
+gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=
+gorm.io/driver/sqlite v1.5.7 h1:8NvsrhP0ifM7LX9G4zPB97NwovUakUxc+2V2uuf3Z1I=
+gorm.io/driver/sqlite v1.5.7/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4=
+gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
+gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
+gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
 nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=

+ 3 - 0
main.go

@@ -25,6 +25,9 @@ func main() {
 	// Gin 框架初始化
 	r:= gin.New()
 
+	// 初始化 DB
+	bootstrap.SetupDB()
+
 	// 初始化路由绑定
 	bootstrap.SetupRoute(r)
 

+ 33 - 0
pkg/database/database.go

@@ -0,0 +1,33 @@
+// Project: go-orm
+// File: pkg/database/database.go
+// Package database 数据库连接
+package database
+
+import (
+	"database/sql"
+	"fmt"
+
+	"gorm.io/gorm"
+	gormlgger "gorm.io/gorm/logger"
+)
+
+// DB 数据库连接实例
+var DB *gorm.DB
+var SQLDB *sql.DB
+
+func Connect(dbConfig gorm.Dialector, _logger gormlgger.Interface) {
+	// 使用 gorm.Open 连接数据库
+	var err error
+	DB, err = gorm.Open(dbConfig, &gorm.Config{
+		Logger: _logger,
+	})
+	// 处理错误
+	if err != nil {
+		fmt.Println("数据库连接失败", err.Error())
+	}
+	// 获取底层的 sql.DB 实例
+	SQLDB, err = DB.DB()
+	if err!= nil {
+		fmt.Println("数据库连接失败", err.Error())
+	}
+}