如何使用多个驱动程序编译Go数据库/ sql程序?

问题描述:

我正在为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" 
........ 

我不知道太多关于“_”然而,对于封装选项我使用它(见下文)。

前面加上_到导入路径将导入包只是正常(运行其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或任何其他)。 –