我可能在這方面花了很多時間,所以我決定在這里嘗試。
我無法弄清楚為什么我的 Register 被呼叫了兩次?
盡我所能,它似乎在一次sql.Register()又一次地呼叫sqlx.Connect()。但是,如果我洗掉sql.Register(),則沒有驅動程式。
老實說,我對 GoLang 還是很陌生,我希望這里有任何方向。
代碼 - 不帶 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()
}
錯誤 - 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
其他資源
- 類似的問題,但沒有解決我的問題鏈接
- SQLX 檔案鏈接
- SQL 檔案鏈接
uj5u.com熱心網友回復:
該包github.com/lib/pq 在 init 函式中注冊它的驅動程式。
從應用程式中洗掉所有注冊驅動程式的直接呼叫:
sql.Register("postgres", &pq.Driver{}) <-- delete this line
匯入執行函式github.com/lib/pq的副作用:init()
package main
import (
"fmt"
"database/sql"
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq" // <-- add this line
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/418782.html
標籤:
