Driver 的一些实现细节。
Driver 如何注册自己
比如 jackc/pgx 库,使用它时需要 import
:
import (
"database/sql"
_ "github.com/jackc/pgx/v4/stdlib"
)
import
的过程中 pgx 会去调用 database/sql
接口去做注册:
// File: $HOME/go/pkg/mod/github.com/jackc/pgx/v4@v4.10.0/stdlib/sql.go
func init() {
pgxDriver = &Driver{
configs: make(map[string]*pgx.ConnConfig),
}
fakeTxConns = make(map[*pgx.Conn]*sql.Tx)
sql.Register("pgx", pgxDriver)
// ...
}
如何选择 database/sql
接口与 driver 自定义的接口
Driver 往往也自己定义了一套接口,而且一般会比 database/sql
功能更多或者性能更佳。
如果你需要一套代码对接多种数据库,同时不需要用到 driver 自己接口提供的额外能力时,建议只用 database/sql
的接口。这也减少了学习成本。