5

我目前正在用 Go 为 sql 数据库(Postgres 和 Mysql)编写一个测试程序。我对包的“_”选项了解不多,但我正在使用它(见下文)。

我希望能够做的是编译一次以对一个 RDBMS 和多个 RDBMS 使用多个 sql 驱动程序,并且在运行程序时,选择要使用的驱动程序和 RDBMS。我不确定这是否可能。目前我使用一个 Postgres 和一个 Mysql 驱动程序进行编译,然后选择我在运行时使用的驱动程序(Postgres/Mysql)。这工作正常,但我需要记住编译了哪个驱动程序。最好能够为一个 RDBMS 使用多个驱动程序进行编译,然后在运行时选择要使用的驱动程序。我想这是不可能的。或者,最好能够在编译时选择要使用的驱动程序,并在运行时知道正在使用哪些驱动程序。如果没有这些设施之一,可能会进行测试,例如。

是否可以有一个编译器选项来选择特定的驱动程序,然后在运行时知道正在使用哪个驱动程序?显然,另一种选择是编辑程序以表明这一点。

导入示例如下:

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

1 回答 1

8

我对包的“_”选项了解不多,但我正在使用它(见下文)。

在导入_路径前添加将正常导入包(运行其init()功能),但不会将当前包中的名称与导入的包相关联。

我希望能够做的是编译一次以对一个 RDBMS 和多个 RDBMS 使用多个 sql 驱动程序,并且在运行程序时,选择要使用的驱动程序和 RDBMS。我不确定这是否可能。

init()package的功能"github.com/go-sql-driver/mysql"如下:

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

它将调用定义为database/sqlRegister函数:

func Register(name string, driver driver.Driver)

并且有条件:

如果 Register 以相同的名称被调用两次,或者如果 driver 为 nil,它会发生恐慌。

注册驱动程序后,您可以使用sql.Open

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

使用第一个参数指定的驱动程序打开到数据库的新连接,例如:

db, e := sql.Open("mysql", "user:pass@host:port")

顺便说一句,github.com/lxn/go-pgsqlinit()函数如下所示:

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

我已经重新阅读了您的问题,并且我认为另外,您还想指定在运行程序时要使用的数据库和驱动程序。

为此,您可以使用该flag并像这样运行您的应用程序:

./my_app -driver=mysql -db="user:pass@host:port"

并将这些字符串传递给sql.Open.

于 2013-10-23T15:47:53.630 回答