登录
首页 >  Golang >  Go问答

如何将数据库连接传递给所有 cobra 命令?

来源:stackoverflow

时间:2024-04-19 19:15:37 138浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《如何将数据库连接传递给所有 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)
    }
}

有时,出于测试目的,传递除数据库对象之外的其他参数会很方便。 Here 是一个实现,其 test 是一个实现。

到这里,我们也就讲完了《如何将数据库连接传递给所有 cobra 命令?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>