我正在Go for sql数据库(Postgres和Mysql)中编写一个测试程序。我不太了解包的“_”选项,但是我正在使用它(见下文)。
我希望能够做的是编译一次,为一个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"
........
答案 0 :(得分:6)
我不太了解包的“_”选项,但是我正在使用它(见下文)。
将_
预先添加到导入路径会正常导入包(运行其“init()
”功能),但它不会将当前包中的名称与导入的包关联。
我希望能够做的是编译一次,为一个RDBMS和多个RDBMS使用多个sql驱动程序,并在运行程序时,选择要使用的驱动程序和RDBMS。我不确定这是否可能。
包init()
的{{1}}功能执行以下操作:
"github.com/go-sql-driver/mysql"
它将调用func init() {
sql.Register("mysql", &MySQLDriver{})
}
的{{3}}函数,该函数定义为:
database/sql
并且有条件:
如果使用相同的名称调用两次Register,或者如果驱动程序为nil,则会发生恐慌。
注册驱动程序后,您可以使用Register
:
func Register(name string, driver driver.Driver)
使用第一个参数指定的驱动程序打开与数据库的新连接,例如:
func Open(driverName, dataSourceName string) (*DB, error)
顺便说一句,db, e := sql.Open("mysql", "user:pass@host:port")
的{{1}}函数如下所示:
github.com/lxn/go-pgsql
我已经重新阅读了您的问题,我认为此外,您还想指定在运行程序时要使用的数据库和驱动程序。
为此,您可以使用sql.Open
并运行您的应用程序:
init()
并将这些字符串传递给func init() {
sql.Register("postgres", sqlDriver{})
}
。