From 1ab5c749a88490d39677e8802c3ccdb3a8318093 Mon Sep 17 00:00:00 2001 From: SliverHorn <503551462@qq.com> Date: Mon, 7 Sep 2020 18:17:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90GORM=E7=9A=84=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=9B=9B=E4=B8=AA=E6=95=B0=E6=8D=AE=E5=BA=93=E7=9A=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/config.yaml | 35 ++++++++++-- server/config/config.go | 39 ++++++++++--- server/go.mod | 4 +- server/initialize/gorm.go | 117 ++++++++++++++++++++++++++++++++++++++ server/main.go | 9 +-- 5 files changed, 182 insertions(+), 22 deletions(-) create mode 100644 server/initialize/gorm.go diff --git a/server/config.yaml b/server/config.yaml index 037c17f9..5b95f9be 100644 --- a/server/config.yaml +++ b/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 diff --git a/server/config/config.go b/server/config/config.go index 9a1197ac..108e6add 100644 --- a/server/config/config.go +++ b/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"` diff --git a/server/go.mod b/server/go.mod index 6ac4777f..143a7a35 100644 --- a/server/go.mod +++ b/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 ) diff --git a/server/initialize/gorm.go b/server/initialize/gorm.go new file mode 100644 index 00000000..7dce551a --- /dev/null +++ b/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 +} diff --git a/server/main.go b/server/main.go index a8e566e2..e3d1d9dc 100644 --- a/server/main.go +++ b/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 -- GitLab