在制作Golang应用程序时
关于Mysql的读取方法,最好使用main函数读取环境变量并将其传递给参数。
原因导致环境变量是一种全局变量情况,在测试过程中从模块外部查看时,您不知道为什么DB程序包连接到名为XXX的主机。我收到的解释是,有人生来怀疑可能会写入固定值
当前代码
mysql.go
func Init() *gorm.DB {
path := strings.Join([]string{os.Getenv("MYSQL_USER"), ":", os.Getenv("MYSQL_PASSWORD"), "@tcp(", os.Getenv("DB_HOST"), ":", os.Getenv("DB_PORT"), ")/", os.Getenv("MYSQL_DATABASE"), "?charset=utf8&parseTime=True&loc=Local"}, "")
db, err := gorm.Open("mysql", path)
if err != nil {
panic(err)
}
err = db.DB().Ping()
if err != nil {
panic(err)
}
DB = db
return DB
}
main.go
func main {
db := mysql.Init()
defer db.Close()
}
如果您能告诉我您是否知道这样做的最佳方法,我会很高兴。
谢谢
答案 0 :(得分:1)
理想情况下,您将拥有一个单独的结构,其中包含所有配置值。然后,您可以使用从各种来源(环境变量,文件等)填充配置结构的函数
此外,您可以使用fmt.Sprintf
来改善路径构建。
这是一个大概的样子。
func Init() *gorm.DB {
cfg := LoadConfigFromEnvironment()
path := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local",
cfg.DBUser,
cfg.DBPassword,
cfg.DBHost,
cfg.DBPort,
cfg.DBName,
)
db, err := gorm.Open("mysql", path)
if err != nil {
panic(err)
}
err = db.DB().Ping()
if err != nil {
panic(err)
}
return db
}
注意,以及我如何删除DB = db
分配。不知道这是怎么回事,但是您不应该从该函数分配一个全局变量。
正如其他人所提到的,理想情况下,您应该将配置加载与初始化分开,因此Init
的定义最好如下所示。
func Init(cfg Config) *gorm.DB {
...
}