postgres
This commit is contained in:
parent
8ed0a4c936
commit
e7ae12b939
|
|
@ -0,0 +1,96 @@
|
|||
package postgres
|
||||
|
||||
import (
|
||||
"os"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"gorm.io/driver/postgres"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/logger"
|
||||
"gorm.io/gorm/schema"
|
||||
"gorm.io/plugin/dbresolver"
|
||||
)
|
||||
|
||||
var (
|
||||
_db *gorm.DB
|
||||
)
|
||||
|
||||
// 创建实例
|
||||
func newDB() (*gorm.DB, error) {
|
||||
if _db != nil {
|
||||
return _db, nil
|
||||
}
|
||||
|
||||
dsn := os.Getenv("POSTGRES_DSN")
|
||||
if dsn == "" {
|
||||
dsn = "host=localhost user=postgres password=postgres dbname=postgres port=5432 sslmode=disable TimeZone=Asia/Shanghai"
|
||||
}
|
||||
maxLifetime := func() int {
|
||||
c := os.Getenv("MAXLIFETIME")
|
||||
cc, err := strconv.Atoi(c)
|
||||
if err != nil {
|
||||
return 1
|
||||
}
|
||||
|
||||
if cc <= 0 {
|
||||
return 1
|
||||
}
|
||||
if cc >= 1000 {
|
||||
cc = 1000
|
||||
}
|
||||
return cc
|
||||
}()
|
||||
maxIdleConns := func() int {
|
||||
c := os.Getenv("MAXIDLECONNS")
|
||||
cc, err := strconv.Atoi(c)
|
||||
if err != nil {
|
||||
return 1
|
||||
}
|
||||
|
||||
if cc < 0 {
|
||||
return 0
|
||||
}
|
||||
if cc >= 1000 {
|
||||
cc = 1000
|
||||
}
|
||||
return cc
|
||||
}()
|
||||
maxOpenConns := func() int {
|
||||
c := os.Getenv("MAXOPENCONNS")
|
||||
cc, err := strconv.Atoi(c)
|
||||
if err != nil {
|
||||
return 1
|
||||
}
|
||||
|
||||
if cc < 0 {
|
||||
return 0
|
||||
}
|
||||
if cc >= 1000 {
|
||||
cc = 1000
|
||||
}
|
||||
return cc
|
||||
}()
|
||||
|
||||
var err error
|
||||
_db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{
|
||||
SkipDefaultTransaction: true,
|
||||
Logger: logger.Default.LogMode(logger.Silent),
|
||||
NamingStrategy: schema.NamingStrategy{
|
||||
SingularTable: true,
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
_db.Use(
|
||||
dbresolver.Register(dbresolver.Config{
|
||||
Sources: []gorm.Dialector{postgres.Open(dsn)},
|
||||
Replicas: []gorm.Dialector{postgres.Open(dsn)},
|
||||
Policy: dbresolver.RandomPolicy{},
|
||||
}).SetConnMaxIdleTime(time.Hour).
|
||||
SetConnMaxLifetime(time.Duration(maxLifetime) * time.Hour).
|
||||
SetMaxIdleConns(maxIdleConns).
|
||||
SetMaxOpenConns(maxOpenConns))
|
||||
return _db, nil
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
package postgres
|
||||
|
||||
import (
|
||||
"os"
|
||||
|
||||
"myschools.me/community/community-api/model"
|
||||
)
|
||||
|
||||
func init() {
|
||||
if os.Getenv("POSTGRES_INIT") != "true" {
|
||||
return
|
||||
}
|
||||
|
||||
db, err := newDB()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if err := db.AutoMigrate(&model.User{}); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if err := db.AutoMigrate(&model.Premises{}); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if err := db.AutoMigrate(&model.Application{}, &model.ApplicationMenu{}); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue