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

Bri*_* Oh 5 sql go

我正在Go for 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"
 ........
Run Code Online (Sandbox Code Playgroud)

thw*_*hwd 6

我不太了解包的"_"选项,但我正在使用它(见下文).

预先_导入路径将正常导入包(运行其' init()函数),但它不会将当前包中的名称与导入的包关联.

我想要做的是编译一次,为一个RDBMS和多个RDBMS使用多个sql驱动程序,并在运行程序时,选择要使用的驱动程序和RDBMS.我不确定这是否可行.

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

func init() {
        sql.Register("mysql", &MySQLDriver{})
}
Run Code Online (Sandbox Code Playgroud)

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

func Register(name string, driver driver.Driver)
Run Code Online (Sandbox Code Playgroud)

并且有条件:

如果使用相同的名称调用两次Register,或者如果驱动程序为nil,则会发生混乱.

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

func Open(driverName, dataSourceName string) (*DB, error)
Run Code Online (Sandbox Code Playgroud)

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

db, e := sql.Open("mysql", "user:pass@host:port")
Run Code Online (Sandbox Code Playgroud)

顺便说一句,它github.com/lxn/go-pgsqlinit()功能看起来像这样:

func init() {
        sql.Register("postgres", sqlDriver{})
}
Run Code Online (Sandbox Code Playgroud)

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

为此,您可以使用该flag并运行您的应用程序,如下所示:

./my_app -driver=mysql -db="user:pass@host:port"
Run Code Online (Sandbox Code Playgroud)

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