Golang: Database: database/sql: Driver Implementation

15th December 2021 at 12:02pm

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 的接口。这也减少了学习成本。