瀏覽代碼

完成GORM的支持四个数据库的配置

SliverHorn 4 年之前
父節點
當前提交
1ab5c749a8
共有 5 個文件被更改,包括 182 次插入22 次删除
  1. 30 5
      server/config.yaml
  2. 31 8
      server/config/config.go
  3. 3 1
      server/go.mod
  4. 117 0
      server/initialize/gorm.go
  5. 1 8
      server/main.go

+ 30 - 5
server/config.yaml

@@ -19,11 +19,36 @@ mysql:
   max-open-conns: 10
   log-mode: false
 
-#sqlite 配置
+# Postgresql connect configuration
+postgresql:
+  username: 'gorm'
+  password: 'gorm'
+  db-name: 'gorm'
+  port: '9920'
+  config: 'sslmode=disable TimeZone=Asia/Shanghai'
+  max-idle-conns: 10
+  max-open-conns: 10
+  logger: false
+  prefer-simple-protocol: true
+
+# sqlite connect configuration
+# sqlite需要gcc支持 windows用户需要自行安装gcc
 sqlite:
-  path: db.db
-  log-mode: true
-  config: 'loc=Asia/Shanghai'
+  # path: 'file::memory:?cache=shared' # 内存模式
+  path: 'db.db'
+  max-idle-conns: 10
+  max-open-conns: 10
+  logger: true
+
+# Sqlserver connect configuration
+sqlserver:
+  username: 'gorm'
+  password: 'LoremIpsum86'
+  db-name: 'gorm'
+  path: 'localhost:9930'
+  max-idle-conns: 10
+  max-open-conns: 10
+  logger: true
 
 # oss configuration
 
@@ -51,7 +76,7 @@ system:
   use-multipoint: false
   env: 'public'  # Change to "develop" to skip authentication for development mode
   addr: 8888
-  db-type: "mysql"  # support mysql/sqlite
+  db-type: "mysql"  # support mysql/postgresql/sqlite/sqlserver
   need-init-data: false
 
 # captcha configuration

+ 31 - 8
server/config/config.go

@@ -2,7 +2,9 @@ package config
 
 type Server struct {
 	Mysql       Mysql       `mapstructure:"mysql" json:"mysql" yaml:"mysql"`
+	Postgresql  Postgresql  `mapstructure:"postgresql" json:"postgresql" yaml:"postgresql"`
 	Sqlite      Sqlite      `mapstructure:"sqlite" json:"sqlite" yaml:"sqlite"`
+	Sqlserver   Sqlserver   `mapstructure:"sqlserver" json:"sqlserver" yaml:"sqlserver"`
 	Qiniu       Qiniu       `mapstructure:"qiniu" json:"qiniu" yaml:"qiniu"`
 	Casbin      Casbin      `mapstructure:"casbin" json:"casbin" yaml:"casbin"`
 	Redis       Redis       `mapstructure:"redis" json:"redis" yaml:"redis"`
@@ -40,6 +42,35 @@ type Mysql struct {
 	LogMode      bool   `mapstructure:"log-mode" json:"logMode" yaml:"log-mode"`
 }
 
+type Postgresql struct {
+	Username             string `mapstructure:"username" json:"username" yaml:"username"`
+	Password             string `mapstructure:"password" json:"password" yaml:"password"`
+	Dbname               string `mapstructure:"db-name" json:"dbname" yaml:"db-name"`
+	Port                 string `mapstructure:"port" json:"port" yaml:"port"`
+	Config               string `mapstructure:"config" json:"config" yaml:"config"`
+	MaxIdleConns         int    `mapstructure:"max-idle-conns" json:"maxIdleConns" yaml:"max-idle-conns"`
+	MaxOpenConns         int    `mapstructure:"max-open-conns" json:"maxOpenConns" yaml:"max-open-conns"`
+	Logger               bool   `mapstructure:"logger" json:"logger" yaml:"logger"`
+	PreferSimpleProtocol bool   `mapstructure:"prefer-simple-protocol" json:"preferSimpleProtocol" yaml:"prefer-simple-protocol"`
+}
+
+type Sqlite struct {
+	Path         string `mapstructure:"path" json:"path" yaml:"path"`
+	MaxIdleConns int    `mapstructure:"max-idle-conns" json:"maxIdleConns" yaml:"max-idle-conns"`
+	MaxOpenConns int    `mapstructure:"max-open-conns" json:"maxOpenConns" yaml:"max-open-conns"`
+	Logger       bool   `mapstructure:"logger" json:"logger" yaml:"logger"`
+}
+
+type Sqlserver struct {
+	Username     string `mapstructure:"username" json:"username" yaml:"username"`
+	Password     string `mapstructure:"password" json:"password" yaml:"password"`
+	Path         string `mapstructure:"path" json:"path" yaml:"path"`
+	Dbname       string `mapstructure:"db-name" json:"dbname" yaml:"db-name"`
+	MaxIdleConns int    `mapstructure:"max-idle-conns" json:"maxIdleConns" yaml:"max-idle-conns"`
+	MaxOpenConns int    `mapstructure:"max-open-conns" json:"maxOpenConns" yaml:"max-open-conns"`
+	Logger       bool   `mapstructure:"logger" json:"logger" yaml:"logger"`
+}
+
 type Redis struct {
 	Addr     string `mapstructure:"addr" json:"addr" yaml:"addr"`
 	Password string `mapstructure:"password" json:"password" yaml:"password"`
@@ -65,14 +96,6 @@ type Captcha struct {
 	ImgHeight int `mapstructure:"img-height" json:"imgHeight" yaml:"img-height"`
 }
 
-type Sqlite struct {
-	Username string `mapstructure:"username" json:"username" yaml:"username"`
-	Password string `mapstructure:"password" json:"password" yaml:"password"`
-	Path     string `mapstructure:"path" json:"path" yaml:"path"`
-	Config   string `mapstructure:"config" json:"config" yaml:"config"`
-	LogMode  bool   `mapstructure:"log-mode" json:"logMode" yaml:"log-mode"`
-}
-
 type Zap struct {
 	Level         string `mapstructure:"level" json:"level" yaml:"level"`
 	Format        string `mapstructure:"format" json:"format" yaml:"format"`

+ 3 - 1
server/go.mod

@@ -41,12 +41,14 @@ require (
 	github.com/tebeka/strftime v0.1.3 // indirect
 	github.com/unrolled/secure v1.0.7
 	go.uber.org/zap v1.10.0
-	golang.org/x/net v0.0.0-20200320220750-118fecf932d8 // indirect
 	golang.org/x/sys v0.0.0-20200610111108-226ff32320da // indirect
 	golang.org/x/tools v0.0.0-20200324003944-a576cf524670 // indirect
 	google.golang.org/protobuf v1.24.0 // indirect
 	gopkg.in/ini.v1 v1.55.0 // indirect
 	gopkg.in/yaml.v2 v2.3.0 // indirect
 	gorm.io/driver/mysql v0.3.1
+	gorm.io/driver/postgres v0.2.6
+	gorm.io/driver/sqlite v1.1.1
+	gorm.io/driver/sqlserver v0.2.4
 	gorm.io/gorm v0.2.35
 )

+ 117 - 0
server/initialize/gorm.go

@@ -0,0 +1,117 @@
+package initialize
+
+import (
+	"gin-vue-admin/global"
+	"go.uber.org/zap"
+	"gorm.io/driver/mysql"
+	"gorm.io/driver/postgres"
+	"gorm.io/driver/sqlite"
+	"gorm.io/driver/sqlserver"
+	"gorm.io/gorm"
+	"gorm.io/gorm/logger"
+	"os"
+)
+
+// Gorm 初始化数据库并产生数据库全局变量
+func Gorm() {
+	switch global.GVA_CONFIG.System.DbType {
+	case "mysql":
+		GormMysql()
+	case "postgresql":
+		GormPostgreSql()
+	case "sqlite":
+		GormSqlite()
+	case "sqlserver":
+		GormSqlServer()
+	}
+}
+
+// GormMysql 初始化Mysql数据库
+func GormMysql()  {
+	m := global.GVA_CONFIG.Mysql
+	dsn := m.Username + ":" + m.Password + "@(" + m.Path + ")/" + m.Dbname + "?" + m.Config
+	mysqlConfig := mysql.Config{
+		DSN:                       dsn,   // DSN data source name
+		DefaultStringSize:         191,   // string 类型字段的默认长度
+		DisableDatetimePrecision:  true,  // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
+		DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
+		DontSupportRenameColumn:   true,  // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
+		SkipInitializeWithVersion: false, // 根据版本自动配置
+	}
+	gormConfig := config(m.LogMode)
+	if db, err := gorm.Open(mysql.New(mysqlConfig), gormConfig); err != nil {
+		global.GVA_LOG.Error("MySQL启动异常", zap.Any("err", err))
+		os.Exit(0)
+	} else {
+		global.GVA_DB = db
+		sqlDB, _ := db.DB()
+		sqlDB.SetMaxIdleConns(m.MaxIdleConns)
+		sqlDB.SetMaxOpenConns(m.MaxOpenConns)
+	}
+}
+
+// GormPostgreSql 初始化PostgreSql数据库
+func GormPostgreSql() {
+	p := global.GVA_CONFIG.Postgresql
+	dsn := "user=" + p.Username + " password=" + p.Password + " dbname=" + p.Dbname + " port=" + p.Port + " " + p.Config
+	postgresConfig := postgres.Config{
+		DSN:                  dsn,                    // DSN data source name
+		PreferSimpleProtocol: p.PreferSimpleProtocol, // 禁用隐式 prepared statement
+	}
+	gormConfig := config(p.Logger)
+	if db, err := gorm.Open(postgres.New(postgresConfig), gormConfig); err != nil {
+		global.GVA_LOG.Error("PostgreSql启动异常", zap.Any("err", err))
+		os.Exit(0)
+	} else {
+		global.GVA_DB = db
+		sqlDB, _ := db.DB()
+		sqlDB.SetMaxIdleConns(p.MaxIdleConns)
+		sqlDB.SetMaxOpenConns(p.MaxOpenConns)
+	}
+}
+
+// GormSqlite 初始化Sqlite数据库
+func GormSqlite() {
+	s := global.GVA_CONFIG.Sqlite
+	gormConfig := config(s.Logger)
+	if db, err := gorm.Open(sqlite.Open(s.Path), gormConfig); err != nil {
+		global.GVA_LOG.Error("Sqlite启动异常", zap.Any("err", err))
+		os.Exit(0)
+	} else {
+		global.GVA_DB = db
+		sqlDB, _ := db.DB()
+		sqlDB.SetMaxIdleConns(s.MaxIdleConns)
+		sqlDB.SetMaxOpenConns(s.MaxOpenConns)
+	}
+}
+
+// GormSqlite 初始化Sqlite数据库
+func GormSqlServer() {
+	ss := global.GVA_CONFIG.Sqlserver
+	dsn := "sqlserver://" + ss.Username + ":" + ss.Password + "@" + ss.Path + "?database=gorm"
+	if db, err := gorm.Open(sqlserver.Open(dsn), &gorm.Config{}); err != nil {
+		global.GVA_LOG.Error("SqlServer启动异常", zap.Any("err", err))
+		os.Exit(0)
+	} else {
+		global.GVA_DB = db
+		sqlDB, _ := db.DB()
+		sqlDB.SetMaxIdleConns(ss.MaxIdleConns)
+		sqlDB.SetMaxOpenConns(ss.MaxOpenConns)
+	}
+}
+
+// config 根据配置决定是否开启日志
+func config(mod bool) (c *gorm.Config) {
+	if mod {
+		c = &gorm.Config{
+			Logger:                                   logger.Default.LogMode(logger.Info),
+			DisableForeignKeyConstraintWhenMigrating: true,
+		}
+	} else {
+		c = &gorm.Config{
+			Logger:                                   logger.Default.LogMode(logger.Silent),
+			DisableForeignKeyConstraintWhenMigrating: true,
+		}
+	}
+	return
+}

+ 1 - 8
server/main.go

@@ -15,14 +15,7 @@ import (
 // @name x-token
 // @BasePath /
 func main() {
-	switch global.GVA_CONFIG.System.DbType {
-	case "mysql":
-		initialize.Mysql()
-	// case "sqlite":
-	//	initialize.Sqlite()  // sqlite需要gcc支持 windows用户需要自行安装gcc 如需使用打开注释即可
-	default:
-		initialize.Mysql()
-	}
+	initialize.Gorm()
 	initialize.DBTables()
 	if global.GVA_CONFIG.System.NeedInitData {
 		init_data.InitData() // 通过配置文件初始化数据 默认为 false 首次运行需要将 ./config.yaml中 system下的 need-init-data 修改为true