如何同时导入两个包并注册MySQL驱动程序?

huangapple go评论112阅读模式
英文:

how to import two package both registe driver mysql

问题

你的项目需要导入两个包,而每个包都注册了MySQL驱动程序,但是你遇到了panic: sql: Register called twice for driver mysql的错误。你想知道如何解决这个问题。

要解决这个问题,你可以尝试以下方法之一:

  1. 检查代码中是否重复注册了MySQL驱动程序。确保只在一个地方进行注册。

  2. 确保你的代码中只导入了一个MySQL驱动程序包。如果导入了多个包,可能会导致重复注册的错误。

  3. 如果你使用的是Go语言的database/sql包,可以使用sql.Register函数注册MySQL驱动程序之前,先检查是否已经注册过。可以使用sql.Drivers函数获取已注册的驱动程序列表,然后检查是否已经包含了MySQL驱动程序。

希望这些方法能够帮助你解决问题!

英文:

my project need to import two package ,while each one registe mysql driver,I got
panic with panic: sql: Register called twice for driver mysql
how to resolve this

答案1

得分: 1

你需要以某种方式重新组织你的项目,以便在同一个进程中不导入两个驱动程序。

通常,实现SQL驱动程序的包会有一个"init()"函数,在该函数中会执行类似以下的操作:

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

例如,请参考:
https://github.com/go-sql-driver/mysql/blob/master/driver.go#L182

但是,根据文档所述,如果注册了相同的驱动程序名称,Register函数将抛出错误:
https://golang.org/pkg/database/sql/#Register

原因是,如果允许在相同名称下注册多个驱动程序,那么在实际使用驱动程序时,你将尝试执行以下操作:

db, err := sql.Open("mysql", someDBUrl)

那么,如果允许注册多个相同名称的驱动程序,sql库应该如何确定要使用哪个驱动程序呢?

英文:

You will need to re-structure your project somehow so that you don't import both drivers in the same process.

Usually, packages implementing SQL drivers would have an "init()" function in which they would do something like:

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

See for example:
https://github.com/go-sql-driver/mysql/blob/master/driver.go#L182

But the Register function will throw an error if the same driver name is registered twice as stated in the docs:
https://golang.org/pkg/database/sql/#Register

Reason for this is that you'd then try to do this to actually use the driver:

db, err := sql.Open("mysql", someDBUrl)

So how should the sql library determine the driver to use if it'd let you register more than one under the same name?

huangapple
  • 本文由 发表于 2017年5月12日 08:45:24
  • 转载请务必保留本文链接:https://go.coder-hub.com/43927676.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定