当前位置: > > > > 如何将数据库连接传递给所有 cobra 命令?
如何将数据库连接传递给所有 cobra 命令?
来源:stackoverflow
2024-04-19 19:15:37
0浏览
收藏
一分耕耘,一分收获!既然打开了这篇文章《如何将数据库连接传递给所有 cobra 命令?》,就坚持看下去吧!文中内容包含等等知识点…希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!
问题内容
所以我创建了一个 cobra 命令
func init() {
rootCmd.AddCommand(versionCmd)
}
var versionCmd = &cobra.Command{
Use: "version",
Short: "Show App version",
Long: "Show App version.",
Run: func(cmd *cobra.Command, args []string) {
dir, _ := os.Getwd()
db, err := gorm.Open(sqlite.Open(fmt.Sprintf("%s/db/db.sqlite", dir)), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
....
},
}
可以看到里面的数据库连接代码。现在我必须在所有命令中添加相同的数据库连接代码。有什么办法可以避免这种情况吗?
正确答案
我建议采用以下方法:
type runefunc func(cmd *cobra.command, args []string) error
func newcmd(db *gorm.db) *cobra.command {
cmd := &cobra.command{
...
rune: runcmd(db),
}
return cmd
}
func runcmd(db *gorm.db) runefunc {
return func(cmd *cobra.command, args []string) error {
// use db here
}
它也很容易测试:
func TestCmd(t *testing.T) {
db := // Open db
cmd := NewCmd(db)
cmd.SetArgs([]string{"any here"})
// You can also modify flags
if err := cmd.Execute(); err != nil {
t.Fatal(err)
}
}
有时,出于测试目的,传递除数据库对象之外的其他参数会很方便。 是一个实现,其 是一个实现。
到这里,我们也就讲完了《如何将数据库连接传递给所有 cobra 命令?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注米云公众号,带你了解更多关于的知识点!
