第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

如何將數(shù)據(jù)庫連接傳遞給所有 Cobra 命令?

如何將數(shù)據(jù)庫連接傳遞給所有 Cobra 命令?

Go
四季花海 2022-08-24 18:43:19
所以我創(chuàng)建了一個(gè)眼鏡蛇命令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")        }           ....    },}你可以看到里面的數(shù)據(jù)庫連接代碼?,F(xiàn)在,我必須在所有命令中添加相同的數(shù)據(jù)庫連接代碼。有沒有辦法避免這種情況?
查看完整描述

2 回答

?
白衣非少年

TA貢獻(xiàn)1155條經(jīng)驗(yàn) 獲得超0個(gè)贊

您可以創(chuàng)建一個(gè)方法來初始化 db,并在 RUN arg 中使用該方法。請嘗試以下操作:


var versionCmd = &cobra.Command{

    .....


    Run: func(cmd *cobra.Command, args []string) {

       db := initDB()     

       ....

    },

}


func initDB() *gorm.DB {

  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")       

  }

  

  return db

}

或者,如果該函數(shù)對于其他命令也是 gerenic,則可以提取該函數(shù)本身。Run


var versionCmd = &cobra.Command{

    .....


    Run: runFunc,

}


func runFunc(cmd *cobra.Command, args []string) {

  // do everythig here

}


查看完整回答
反對 回復(fù) 2022-08-24
?
動漫人物

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊

我建議采用以下方法:


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)

    }

}

有時(shí),出于測試目的,傳遞數(shù)據(jù)庫對象以外的其他參數(shù)非常方便。下面是一個(gè)實(shí)現(xiàn)及其測試。


查看完整回答
反對 回復(fù) 2022-08-24
  • 2 回答
  • 0 關(guān)注
  • 91 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號