我有一个cobra项目,该项目使用sqlx
包访问数据库,并且该命令具有子命令。与眼镜蛇相关的代码位于cmd
文件夹/子包中,而与数据库相关的代码位于db
文件夹/子包中。
我想让db包具有工厂功能
func NewDB() *sqlx.DB
,它是从cmd
包中调用的。但是我不确定在哪里调用它以及如何使它可用于所有子命令。
一个想法是在cmd
包中包含一个全局变量,并在root.go
的{{1}}或init()
的{{1}}中对其进行初始化。在这种情况下使用全局变量是否不好?
如果我不使用全局变量,
一种可能是让子命令调用rootCmd
。这种方式也不是很舒服。
我发现最好在PersistentPreRun
包中(可能在db.NewDB()
中调用db.NewDB()
一次。但是我应该在哪里保存数据库句柄,以便子命令可以使用它?