2016-08-07 62 views
2

在代碼試圖成爲數據庫無關,我想執行一些特定數據庫的查詢,所以我需要在Go語言來了解數據庫驅動程序的名稱:如何確定我正在使用的數據庫驅動程序的名稱?

db,err := sql.Open(dbstr, dbconnstr) 
    if err != nil { 
      log.Fatal(err) 
    } 
    errp := db.Ping() 
    if errp != nil { 
      log.Fatal(errp) 
    } 
    log.Printf("%s\n", db.Driver()) 

我怎麼能確定數據庫驅動程序我的名字正在使用?

回答

2

postgres://[email protected]:5432/db_name?sslmode=disable之類的網址格式輸入數據庫字符串。

然後找到你正在使用URL包的Parse函數的數據庫類型。根據數據庫類型,運行db特定查詢。

func New(url string) (Driver, error) { 
    u, err := neturl.Parse(url) 
    if err != nil { 
     return nil, err 
    } 

    switch u.Scheme { 
    case "postgres": 
     d := &postgres.Driver{} 
     if err := d.Initialize(url); err != nil { 
      return nil, err 
     } 
     return d, nil 

    case "mysql": 
     d := &mysql.Driver{} 
     if err := d.Initialize(url); err != nil { 
      return nil, err 
     } 
     return d, nil 

    case "bash": 
     d := &bash.Driver{} 
     if err := d.Initialize(url); err != nil { 
      return nil, err 
     } 
     return d, nil 

    case "cassandra": 
     d := &cassandra.Driver{} 
     if err := d.Initialize(url); err != nil { 
      return nil, err 
     } 
     return d, nil 
    case "sqlite3": 
     d := &sqlite3.Driver{} 
     if err := d.Initialize(url); err != nil { 
      return nil, err 
     } 
     return d, nil 
    default: 
     return nil, errors.New(fmt.Sprintf("Driver '%s' not found.", u.Scheme)) 
    } 
} 
0

您應該已經知道數據庫驅動程序的名稱,因爲它由您用dbstr變量標識的參數表示。

db, err := sql.Open("postgres", "user= ... ") 
if err != nil { 
    log.Fatal(err) 
} 

db.Driver()正確返回使用的底層驅動程序,但你格式化爲string(因爲%s)。如果您更改%s%T,你會看到,它正確地打印出類型:

log.Printf("%T\n", db.Driver()) 

例如,如果您使用github.com/lib/pq,輸出爲*pq.drv。這是相同的使用reflect包的:

log.Printf("%s\n", reflect.TypeOf(db.Driver())) 

它可能是不切實際的使用,用於執行的條件執行該值。此外,Driver接口沒有指定獲取特定驅動程序信息的任何方式,但Open()函數除外。

如果您有特定需求,您可能需要使用在打開連接時傳遞的驅動程序名稱,或者創建委託給原始驅動程序並處理自定義邏輯的特定驅動程序。

相關問題