(GoLang) 报错: panic: sql: Register called twice for driver postgres

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

(GoLang) panic: sql: Register called twice for driver postgres

问题

我可能在这上面花了太多时间,所以我决定在这里尝试一下。
我在弄清楚为什么我的 Register 被调用两次时遇到了问题。
我能想到的最好的解释是,在 sql.Register()sqlx.Connect() 处都调用了一次。但是如果我移除 sql.Register(),那么就没有驱动程序了。

老实说,我对 Go 语言还是比较新的,希望能得到任何方向上的帮助。

以下是没有 sql.Register 的代码:

package main

import (
	"fmt"
	"database/sql"
	"github.com/jmoiron/sqlx"
)

const (
	host     = "localhost"
	port     = 5432
	user     = "postgres"
	password = "password"
	dbname   = "sampledb"
)

/*-------------------------------------------*/
/*                Functions                  */
/*-------------------------------------------*/
// Error Checking Fn
func CheckError(err error, str string) {
	if err != nil {
		fmt.Printf("Error @ : %s\n", str)
		panic(err)
	}
}

/*-------------------------------------------*/
/*                 Main()                    */
/*-------------------------------------------*/

func main() {
	// Open DB Conn
	psqlconn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbname)
	// sql.Register("postgres", &pq.Driver{})
	fmt.Printf(":: Drivers ::\n%s\n", sql.Drivers())
	db, err := sqlx.Connect("postgres", psqlconn)
	CheckError(err, "Main: sqlx.connect")
	defer db.Close()
}

没有 sql.Register 的错误信息:

$ go run name-generator.go 
:: Drivers ::
[]
Error @ : Main: sqlx.connect
panic: sql: unknown driver "postgres" (forgotten import?)

goroutine 1 [running]:
main.CheckError({0xc84320, 0xc000056680}, {0xc6073f, 0x5})
        C:/path/to/program.go:26 +0xa7    <--- Func CheckError(): panic(err)
main.main()
        C:/path/to/program.go:40 +0x125   <--- Func Main(): CheckError()
exit status 2

以下是有 sql.Register 的代码:

package main

import (
	"fmt"
	"database/sql"
	"github.com/jmoiron/sqlx"
	"github.com/lib/pq"
)

const (
	host     = "localhost"
	port     = 5432
	user     = "postgres"
	password = "password"
	dbname   = "sampledb"
)

/*-------------------------------------------*/
/*                Functions                  */
/*-------------------------------------------*/
// Error Checking Fn
func CheckError(err error, str string) {
	if err != nil {
		fmt.Printf("Error @ : %s\n", str)
		panic(err)
	}
}

/*-------------------------------------------*/
/*                 Main()                    */
/*-------------------------------------------*/

func main() {
	// Open DB Conn
	psqlconn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbname)
	sql.Register("postgres", &pq.Driver{})
	fmt.Printf(":: Drivers ::\n%s\n", sql.Drivers())
	db, err := sqlx.Connect("postgres", psqlconn)
	CheckError(err, "Main: sqlx.connect")
	defer db.Close()
}

sql.Register 的错误信息:

$ go run name-generator.go 
panic: sql: Register called twice for driver postgres

goroutine 1 [running]:
database/sql.Register({0xa98bc9, 0x8}, {0xae6680, 0xc8a950})
        C:/Program Files/Go/src/database/sql/sql.go:51 +0x13d
main.main()
        C:/path/to/program.go:38 +0x11b
exit status 2

其他资源:

  • 类似的问题,但不能解决我的问题 链接
  • SQLX 文档 链接
  • SQL 文档 链接
英文:

I have probably spent way to much time on this, so I decided to try here.
I'm having trouble figuring out why my Register is being called twice?
Best I can figure, it seems to be calling once at sql.Register() and again at sqlx.Connect(). But if I remove the sql.Register(), then theres no drivers.

Honestly, I am pretty new to GoLang, I'm hoping for any sort of direction here.

Code - w/o sql.Register

package main

import (
	&quot;fmt&quot;

	&quot;database/sql&quot;

	&quot;github.com/jmoiron/sqlx&quot;
)

const (
	host     = &quot;localhost&quot;
	port     = 5432
	user     = &quot;postgres&quot;
	password = &quot;password&quot;
	dbname   = &quot;sampledb&quot;
)

/*-------------------------------------------*\
||                Functions                  ||
\*-------------------------------------------*/
// Error Checking Fn
func CheckError(err error, str string) {
	if err != nil {
		fmt.Printf(&quot;Error @ : %s\n&quot;, str)
		panic(err)
	}
}

/*-------------------------------------------*\
||                 Main()                    ||
\*-------------------------------------------*/

func main() {
	// Open DB Conn
	psqlconn := fmt.Sprintf(&quot;host=%s port=%d user=%s password=%s dbname=%s sslmode=disable&quot;, host, port, user, password, dbname)
	// sql.Register(&quot;postgres&quot;, &amp;pq.Driver{})
	fmt.Printf(&quot;:: Drivers ::\n%s\n&quot;, sql.Drivers())
	db, err := sqlx.Connect(&quot;postgres&quot;, psqlconn)
	CheckError(err, &quot;Main: sqlx.connect&quot;)
	defer db.Close()
}

Error - w/o sql.Register

$ go run name-generator.go 
:: Drivers ::
[]
Error @ : Main: sqlx.connect
panic: sql: unknown driver &quot;postgres&quot; (forgotten import?)

goroutine 1 [running]:
main.CheckError({0xc84320, 0xc000056680}, {0xc6073f, 0x5})
        C:/path/to/program.go:26 +0xa7    &lt;--- Func CheckError(): panic(err)
main.main()
        C:/path/to/program.go:40 +0x125   &lt;--- Func Main(): CheckError()
exit status 2

Code - w/ sql.Register

package main

import (
	&quot;fmt&quot;

	&quot;database/sql&quot;

	&quot;github.com/jmoiron/sqlx&quot;
	&quot;github.com/lib/pq&quot;
)

const (
	host     = &quot;localhost&quot;
	port     = 5432
	user     = &quot;postgres&quot;
	password = &quot;password&quot;
	dbname   = &quot;sampledb&quot;
)

/*-------------------------------------------*\
||                Functions                  ||
\*-------------------------------------------*/
// Error Checking Fn
func CheckError(err error, str string) {
	if err != nil {
		fmt.Printf(&quot;Error @ : %s\n&quot;, str)
		panic(err)
	}
}

/*-------------------------------------------*\
||                 Main()                    ||
\*-------------------------------------------*/

func main() {
	// Open DB Conn
	psqlconn := fmt.Sprintf(&quot;host=%s port=%d user=%s password=%s dbname=%s sslmode=disable&quot;, host, port, user, password, dbname)
	sql.Register(&quot;postgres&quot;, &amp;pq.Driver{})
	fmt.Printf(&quot;:: Drivers ::\n%s\n&quot;, sql.Drivers())
	db, err := sqlx.Connect(&quot;postgres&quot;, psqlconn)
	CheckError(err, &quot;Main: sqlx.connect&quot;)
	defer db.Close()
}

Error - w/ sql.Register

$ go run name-generator.go 
panic: sql: Register called twice for driver postgres

goroutine 1 [running]:
database/sql.Register({0xa98bc9, 0x8}, {0xae6680, 0xc8a950})
        C:/Program Files/Go/src/database/sql/sql.go:51 +0x13d
main.main()
        C:/path/to/program.go:38 +0x11b
exit status 2

Additional Resources

  • Similar issue, but doesn't solve my problem Link
  • SQLX Documentation Link
  • SQL Documentation Link

答案1

得分: 2

github.com/lib/pq在一个init函数中注册了它的驱动

从应用程序中删除直接调用注册驱动的代码行:

 sql.Register("postgres", &pq.Driver{})  // <-- 删除这行

导入github.com/lib/pq以执行init()函数的副作用:

package main
import (
"fmt"
"database/sql"
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq"  // <-- 添加这行
)
英文:

The package github.com/lib/pq registers it's driver in an init function.

Remove the direct call to register the driver from the application:

 sql.Register(&quot;postgres&quot;, &amp;pq.Driver{}) &lt;-- delete this line

Import github.com/lib/pq for the side effect of executing the init() function:

package main
import (
&quot;fmt&quot;
&quot;database/sql&quot;
&quot;github.com/jmoiron/sqlx&quot;
_ &quot;github.com/lib/pq&quot;  // &lt;-- add this line
)

huangapple
  • 本文由 发表于 2022年1月22日 12:57:10
  • 转载请务必保留本文链接:https://go.coder-hub.com/70810126.html
匿名

发表评论

匿名网友

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

确定