database/sql/driver

Guided tour · Database · pkg.go.dev →

Interfaces implemented by database drivers. You only touch this if you're writing a driver — or implementing Valuer/Scanner on custom types.

Custom value types

Make your own type round-trip through database/sql by implementing Valuer and Scanner.

Valuer and Scanner

type JSON map[string]any

func (j JSON) Value() (driver.Value, error) {
    return json.Marshal(j)
}

func (j *JSON) Scan(src any) error {
    switch v := src.(type) {
    case []byte:
        return json.Unmarshal(v, j)
    case string:
        return json.Unmarshal([]byte(v), j)
    case nil:
        *j = nil; return nil
    }
    return fmt.Errorf("cannot scan %T into JSON", src)
}

Writing a driver (rare)

Register a driver

func init() {
    sql.Register("mydriver", &MyDriver{})
}
// Implement driver.Driver, driver.Connector, driver.Conn, etc.