2013-10-23 89 views
4

我正在爲Go數據庫(Postgres和Mysql)編寫一個測試程序。我對包的「_」選項瞭解不多,但是我正在使用它(請參見下文)。如何使用多個驅動程序編譯Go數據庫/ sql程序?

我想要做的就是編譯一次,爲一個RDBMS和多個RDBMS使用多個sql驅動程序,並在運行該程序時選擇使用哪個驅動程序和RDBMS。我不確定這是否可能。目前我使用一個Postgres和一個Mysql驅動程序進行編譯,然後選擇在運行時使用哪一個(Postgres/Mysql)。這工作正常,但我需要記住哪個驅動程序編譯。能夠用一個RDBMS的多個驅動程序進行編譯,然後在運行時選擇使用哪一個將是一件好事。我想這是不可能的。或者,能夠在編譯時選擇使用哪些驅動程序並在運行時知道正在使用哪些驅動程序將是一件好事。沒有這些設施之一,可以測試例如。 Postgres,並認爲他們使用一個驅動程序時,實際上該程序已與另一個驅動程序編譯。

是否有可能有編譯器選項來選擇特定的驅動程序,然後在運行時知道哪個驅動程序正在使用?另一種方法顯然是編輯程序來表明這一點。

進口的一個例子如下:

import (
    "database/sql" 
    _ "github.com/go-sql-driver/mysql" 
    ////_ "github.com/lib/pq" 
    _ "github.com/lxn/go-pgsql" 
........ 

回答

5

我不知道太多關於「_」然而,對於封裝選項我使用它(見下文)。

前面加上_到導入路徑將導入包只是正常(運行其init()功能),但它不會在名稱在當前的包導入包關聯。

我想要做的就是編譯一次,爲一個RDBMS使用多個sql驅動程序,也可以爲多個RDBMS使用,當運行該程序時,選擇使用哪個驅動程序和RDBMS。我不確定這是否可能。

包的init()功能"github.com/go-sql-driver/mysql"執行以下操作:

func init() { 
     sql.Register("mysql", &MySQLDriver{}) 
} 

它將調用database/sql的其被定義爲Register功能:

func Register(name string, driver driver.Driver) 

並具有以下條件:

如果使用相同名稱調用Register兩次,或者如果驅動程序爲零,則會發生混亂。

司機已被註冊後,您可以使用sql.Open

func Open(driverName, dataSourceName string) (*DB, error) 

打開到數據庫的新連接,使用由第一個參數指定的驅動程序,即G:

db, e := sql.Open("mysql", "user:[email protected]:port") 

順便說一句,github.com/lxn/go-pgsqlinit()功能如下:

func init() { 
     sql.Register("postgres", sqlDriver{}) 
} 

我已經重新閱讀你的問題,我認爲,另外,你想指定運行程序時要使用的數據庫和驅動程序。

對於這一點,你可以使用flag package並運行你的應用程序是這樣的:

./my_app -driver=mysql -db="user:[email protected]:port" 

,並通過這些字符串sql.Open

+0

謝謝,我會研究你的答案,看看它是否解決了它可能的「問題」,但我可以更清楚。我沒有問題編譯與2個不同的驅動程序Postgres/Mysql。在運行時,我提示輸入Mysql或Postgresql,並且全部顯示工作正常。我想你也已經向「導入」解釋了「_」前綴。我想用任何數量的「數據庫/ sql」庫(例如_「github.com/lib/pq」,_「github.com/lxn/go-pgsql」和Mysql)進行編譯,並且在運行時如果(例如)Postgres被選中,也允許在運行時選擇驅動程序(lib/pq或lxn或任何其他)。 –