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 }