You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
3.7 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package model
import (
"fmt"
"github.com/fonchain/fonchain-container/pkg/config"
"gopkg.in/ini.v1"
"os"
"strings"
"time"
"github.com/fonchain/fonchain-container/cmd/model"
"github.com/fonchain/fonchain-container/pkg/m"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/schema"
)
var DB *gorm.DB
var (
Db string
DbHost string
DbPort string
DbUser string
DbPassWord string
DbLogName string
)
func Init(confPath string) {
//从本地读取环境变量
file, err := ini.Load(confPath)
if err != nil {
fmt.Println(m.ERROR_SERVER, err)
}
//加载数据库配置
LoadMysqlData(file)
//MySQL数据库
path := strings.Join([]string{DbUser, ":", DbPassWord, "@tcp(", DbHost, ":", DbPort, ")/", DbLogName, "?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai"}, "")
//连接数据库
Database(path)
//迁移表 如果需要就打开使用
migration()
// 生成视图 ,如果更新报错需要手动删除视图后再执行程序
if err = generateModelView(); err != nil {
fmt.Println("创建或更新视图失败,错误内容:", err.Error())
os.Exit(1)
}
}
func LoadMysqlData(file *ini.File) {
Db = file.Section("mysql").Key("Db").String()
DbHost = file.Section("mysql").Key("DbHost").String()
DbPort = file.Section("mysql").Key("DbPort").String()
DbUser = file.Section("mysql").Key("DbUser").String()
DbPassWord = file.Section("mysql").Key("DbPassWord").String()
DbLogName = file.Section("mysql").Key("DbName").String()
fmt.Println("数据库配置=====================================================")
fmt.Println("\tDb:", Db)
fmt.Println("\tDbHost:", DbHost)
fmt.Println("\tDbPort:", DbPort)
fmt.Println("\tDbUser:", DbUser)
fmt.Println("\tDbPassWord:", DbPassWord)
fmt.Println("\tDbLogName:", DbLogName)
}
func Database(conn string) {
var ormLogger logger.Interface
if config.Zap.Level == "debug" {
ormLogger = logger.Default.LogMode(logger.Info)
} else {
ormLogger = logger.Default
}
db, err := gorm.Open(mysql.New(mysql.Config{
DSN: conn, // DSN data source name
DefaultStringSize: 256, // string 类型字段的默认长度
DisableDatetimePrecision: true, // 禁用 datetime 精度MySQL 5.6 之前的数据库不支持
DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
DontSupportRenameColumn: true, // 用 `change` 重命名列MySQL 8 之前的数据库和 MariaDB 不支持重命名列
SkipInitializeWithVersion: false, // 根据版本自动配置
}), &gorm.Config{
Logger: ormLogger,
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
},
DisableForeignKeyConstraintWhenMigrating: true, //表结构迁移时禁用外键约束(不会添加外键关联)
})
sqlDB, _ := db.DB()
sqlDB.SetMaxIdleConns(20) //设置连接池,空闲
sqlDB.SetMaxOpenConns(100) //打开
sqlDB.SetConnMaxLifetime(time.Second * 30)
DB = db
if err != nil {
panic(err)
}
}
func migration() {
//自迁移模式
err := DB.AutoMigrate(
&model.Container{}, //货柜
&model.ContainerBox{}, //货柜格子/孔洞
&model.Tag{}, //标签
&model.Device{}, //设备
&model.DevicePin{}, //设备引脚
&model.BoxRelPin{}, //各自与设备引脚的关联
&model.OperationRecord{}, //操作记录
)
if err != nil {
fmt.Println("register table fail")
fmt.Println(err.Error())
os.Exit(0)
}
fmt.Println("register table success")
}
// 创建视图
func generateModelView(functions ...func(db *gorm.DB) error) (err error) {
if functions == nil {
return
}
for _, viewFunc := range functions {
err = viewFunc(DB)
if err != nil {
return err
}
}
return nil
}