目前,我正在为sql数据库(Postgres和Mysql)编写一个Go测试程序。我对软件包的"_“选项不太了解,但是我正在使用它(见下文)。
我想要做的是编译一次,为一个RDBMS使用多个sql驱动程序,对于多个RDBMS,在运行程序时,选择要使用的驱动程序和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"
........发布于 2013-10-23 15:47:53
我对软件包的"_“选项不太了解,但是我正在使用它(见下文)。
预置_到导入路径将正常导入包(运行它的‘init()函数),但它不会将当前包中的名称与导入的包相关联。
我想要做的是编译一次,为一个RDBMS使用多个sql驱动程序,对于多个RDBMS,在运行程序时,选择要使用的驱动程序和RDBMS。我不确定这是否可能。
package "github.com/go-sql-driver/mysql"的"github.com/go-sql-driver/mysql"函数执行以下操作:
func init() {
sql.Register("mysql", &MySQLDriver{})
}它将调用database/sql的Register函数,定义为:
func Register(name string, driver driver.Driver)并具备以下条件:
如果注册被用相同的名字两次调用,或者如果驱动程序是零,它会恐慌。
在注册了驱动程序之后,可以使用sql.Open
func Open(driverName, dataSourceName string) (*DB, error)使用第一个参数指定的驱动程序打开到数据库的新连接,例如:
db, e := sql.Open("mysql", "user:pass@host:port")顺便说一下,github.com/lxn/go-pgsql的init()函数如下所示:
func init() {
sql.Register("postgres", sqlDriver{})
}我已经重新阅读了您的问题,我认为,另外,您希望指定在运行程序时要使用的数据库和驱动程序。
为此,您可以使用 package并按以下方式运行应用程序:
./my_app -driver=mysql -db="user:pass@host:port"并将这些字符串传递给sql.Open。
https://stackoverflow.com/questions/19536292
复制相似问题