sql/driver
20 分钟阅读
Package driver defines interfaces to be implemented by database drivers as used by package sql.
driver
包定义了数据库驱动需要实现的接口,供sql
包使用。
Most code should use package sql.
大多数代码应该使用 sql
包。
The driver interface has evolved over time. Drivers should implement Connector and DriverContext interfaces. The Connector.Connect and Driver.Open methods should never return ErrBadConn. ErrBadConn should only be returned from Validator, SessionResetter, or a query method if the connection is already in an invalid (e.g. closed) state.
随着时间的推移,驱动程序接口已经发生了演变。驱动程序应实现Connector和DriverContext接口。 Connector.Connect和Driver.Open方法永远不应该返回ErrBadConn。如果连接已经处于无效状态(例如已关闭),则 ErrBadConn 只能从 Validator、SessionResetter 或查询方法中返回。
All Conn implementations should implement the following interfaces: Pinger, SessionResetter, and Validator.
所有 Conn 实现应实现以下接口:Pinger、SessionResetter和Validator。
If named parameters or context are supported, the driver’s Conn should implement: ExecerContext, QueryerContext, ConnPrepareContext, and ConnBeginTx.
如果支持命名参数或上下文,则驱动程序的Conn应实现:ExecerContext、QueryerContext、ConnPrepareContext和ConnBeginTx。
To support custom data types, implement NamedValueChecker. NamedValueChecker also allows queries to accept per-query options as a parameter by returning ErrRemoveArgument from CheckNamedValue.
为了支持自定义数据类型,则需实现NamedValueChecker。NamedValueChecker还允许查询通过返回ErrRemoveArgument来接受每个查询选项作为参数。
If multiple result sets are supported, Rows should implement RowsNextResultSet. If the driver knows how to describe the types present in the returned result it should implement the following interfaces: RowsColumnTypeScanType, RowsColumnTypeDatabaseTypeName, RowsColumnTypeLength, RowsColumnTypeNullable, and RowsColumnTypePrecisionScale. A given row value may also return a Rows type, which may represent a database cursor value.
如果支持多个结果集,则Rows应实现RowsNextResultSet。如果驱动程序知道如何描述返回结果中存在的类型,则应实现以下接口:RowsColumnTypeScanType、RowsColumnTypeDatabaseTypeName、RowsColumnTypeLength、RowsColumnTypeNullable和RowsColumnTypePrecisionScale。给定的行值还可以返回一个Rows类型,它可以表示数据库游标值。
Before a connection is returned to the connection pool after use, IsValid is called if implemented. Before a connection is reused for another query, ResetSession is called if implemented. If a connection is never returned to the connection pool but immediately reused, then ResetSession is called prior to reuse but IsValid is not called.
在将连接归还给连接池之前,如果实现了 IsValid,则会调用 IsValid。在连接被重用于另一个查询之前,如果实现了 ResetSession,则会调用 ResetSession。如果连接从未返回到连接池而立即被重用,则在重用之前将调用ResetSession,但不会调用IsValid。
常量
This section is empty.
变量
|
|
Bool is a ValueConverter that converts input values to bools.
Bool是一个ValueConverter,用于将输入值转换为布尔值
The conversion rules are:
转换规则如下:
booleans are returned unchanged
布尔值保持不变
for integer types, 1 is true 0 is false, other integers are an error
对于整数类型,1为true,0为false,其他整数为错误
for strings and []byte, same rules as strconv.ParseBool
对于字符串和[]byte,与strconv.ParseBool相同的规则
all other types are an error
所有其他类型均为错误
|
|
DefaultParameterConverter is the default implementation of ValueConverter that’s used when a Stmt doesn’t implement ColumnConverter.
DefaultParameterConverter是ValueConverter的默认实现,当Stmt未实现ColumnConverter时使用。
DefaultParameterConverter returns its argument directly if IsValue(arg). Otherwise, if the argument implements Valuer, its Value method is used to return a Value. As a fallback, the provided argument’s underlying type is used to convert it to a Value: underlying integer types are converted to int64, floats to float64, bool, string, and []byte to themselves. If the argument is a nil pointer, ConvertValue returns a nil Value. If the argument is a non-nil pointer, it is dereferenced and ConvertValue is called recursively. Other types are an error.
DefaultParameterConverter直接返回其实参(如果IsValue(arg))。否则,如果实参实现了Valuer接口,则使用其Value方法返回一个Value。作为后备方案,使用提供的实参的底层类型将其转换为Value:底层整数类型转换为int64,浮点数转换为float64,bool、string和[]byte保持不变。如果实参是nil指针,则ConvertValue返回一个nil Value。如果实参是非nil指针,则取消引用并递归调用ConvertValue。其他类型为错误。
|
|
ErrBadConn should be returned by a driver to signal to the sql package that a driver.Conn is in a bad state (such as the server having earlier closed the connection) and the sql package should retry on a new connection.
ErrBadConn应由驱动程序返回,以向sql包发出信号,表明driver.Conn处于不良状态(例如服务器早些时候关闭了连接),sql包应在新的连接上重试。
To prevent duplicate operations, ErrBadConn should NOT be returned if there’s a possibility that the database server might have performed the operation. Even if the server sends back an error, you shouldn’t return ErrBadConn.
为防止重复操作,如果数据库服务器可能已执行操作,则不应返回ErrBadConn。即使服务器返回错误,也不应返回ErrBadConn。
Errors will be checked using errors.Is. An error may wrap ErrBadConn or implement the Is(error) bool method.
错误将使用errors.Is进行检查。错误可能会包装ErrBadConn或实现Is(error) bool方法。
|
|
ErrRemoveArgument may be returned from NamedValueChecker to instruct the sql package to not pass the argument to the driver query interface. Return when accepting query specific options or structures that aren’t SQL query arguments.
ErrRemoveArgument可能从NamedValueChecker返回,指示sql包不将实参传递给驱动程序查询接口。在接受非SQL查询实参的特定查询选项或结构时返回。
|
|
ErrSkip may be returned by some optional interfaces’ methods to indicate at runtime that the fast path is unavailable and the sql package should continue as if the optional interface was not implemented. ErrSkip is only supported where explicitly documented.
ErrSkip可能由某些可选接口的方法在运行时返回,以指示快速路径不可用,sql包应继续执行,就像可选接口未实现一样。ErrSkip仅在显式文档中支持。
|
|
Int32 is a ValueConverter that converts input values to int64, respecting the limits of an int32 value.
Int32是一个ValueConverter,将输入值转换为int64,同时考虑int32值的限制。
|
|
ResultNoRows is a pre-defined Result for drivers to return when a DDL command (such as a CREATE TABLE) succeeds. It returns an error for both LastInsertId and RowsAffected.
ResultNoRows是预定义的Result,供驱动程序在DDL命令(例如CREATE TABLE)成功时返回。它同时返回LastInsertId和RowsAffected的错误。
|
|
String is a ValueConverter that converts its input to a string. If the value is already a string or []byte, it’s unchanged. If the value is of another type, conversion to string is done with fmt.Sprintf("%v", v).
String是一个ValueConverter,将其输入转换为字符串。如果值已经是字符串或[]byte,则保持不变。如果值是其他类型,则使用fmt.Sprintf("%v", v)
将其转换为字符串。
函数
func IsScanValue
|
|
IsScanValue is equivalent to IsValue. It exists for compatibility.
IsScanValue函数和IsValue函数是等价的,为了兼容性而存在。
func IsValue
|
|
IsValue reports whether v is a valid Value parameter type.
IsValue函数用于判断参数v
是否是有效的Value参数类型。
类型
type ColumnConverter <- DEPRECATED
|
|
ColumnConverter may be optionally implemented by Stmt if the statement is aware of its own columns’ types and can convert from any type to a driver Value.
Deprecated: Drivers should implement NamedValueChecker.
type Conn
|
|
Conn is a connection to a database. It is not used concurrently by multiple goroutines.
Conn 是到数据库的连接。它不允许多个goroutine并发使用。
Conn is assumed to be stateful.
Conn 被认为是有状态的。
type ConnBeginTx <- go1.8
|
|
ConnBeginTx enhances the Conn interface with context and TxOptions.
ConnBeginTx 使用 context 和 TxOptions 增强了 Conn 接口。
type ConnPrepareContext <- go1.8
|
|
ConnPrepareContext enhances the Conn interface with context.
ConnPrepareContext 通过context增强 Conn 接口。
type Connector <- go1.10
|
|
A Connector represents a driver in a fixed configuration and can create any number of equivalent Conns for use by multiple goroutines.
Connector 表示一个具有固定配置的驱动程序,可以为多个 goroutine 创建任意数量的等效 Conns。
A Connector can be passed to sql.OpenDB, to allow drivers to implement their own sql.DB constructors, or returned by DriverContext’s OpenConnector method, to allow drivers access to context and to avoid repeated parsing of driver configuration.
可以将 Connector 传递给 sql.OpenDB,以允许驱动程序实现自己的 sql.DB 构造函数,或者通过 DriverContext 的 OpenConnector 方法返回,以允许驱动程序访问上下文并避免重复解析驱动程序配置。
If a Connector implements io.Closer, the sql package’s DB.Close method will call Close and return error (if any).
如果 Connector 实现了 io.Closer,则 sql 包的 DB.Close 方法将调用 Close 并返回错误(如果有)。
type Driver
|
|
Driver is the interface that must be implemented by a database driver.
Driver 是必须由数据库驱动程序实现的接口。
Database drivers may implement DriverContext for access to contexts and to parse the name only once for a pool of connections, instead of once per connection.
数据库驱动程序可以实现对DriverContext的访问,以便访问上下文,并将 name 解析为连接池中的连接,而不是每个连接解析一次。
type DriverContext <- go1.10
|
|
If a Driver implements DriverContext, then sql.DB will call OpenConnector to obtain a Connector and then invoke that Connector’s Connect method to obtain each needed connection, instead of invoking the Driver’s Open method for each connection. The two-step sequence allows drivers to parse the name just once and also provides access to per-Conn contexts.
如果一个 Driver 实现了 DriverContext 接口,则 sql.DB 将调用 OpenConnector 方法来获取 Connector,然后调用该 Connector 的 Connect 方法来获取每个所需的连接,而不是为每个连接调用Driver的 Open 方法。这种两步序列允许驱动程序只解析name一次,并且还提供对每个Conn上下文的访问。
type Execer <- DEPRECATED
|
|
Execer is an optional interface that may be implemented by a Conn.
Execer是一个可选的接口,可以由Conn(这里是泛指的意思下Conn)实现。
If a Conn implements neither ExecerContext nor Execer, the sql package’s DB.Exec will first prepare a query, execute the statement, and then close the statement.
如果一个Conn(这里是泛指的意思下Conn)既没有实现ExecerContext也没有实现Execer,则sql包的DB.Exec将首先准备一个查询,执行语句,然后关闭语句。
Exec may return ErrSkip.
Exec可以返回ErrSkip。
Deprecated: Drivers should implement ExecerContext instead.
已弃用:驱动程序应改为实现ExecerContext接口。
type ExecerContext <- go1.8
|
|
ExecerContext is an optional interface that may be implemented by a Conn.
ExecerContext 是一个可选接口,可以由 Conn (这里是泛指的意思下Conn)实现。
If a Conn does not implement ExecerContext, the sql package’s DB.Exec will fall back to Execer; if the Conn does not implement Execer either, DB.Exec will first prepare a query, execute the statement, and then close the statement.
如果 Conn (这里是泛指的意思下Conn)没有实现 ExecerContext,则 sql 包的 DB.Exec 将回退到 Execer;如果 Conn (这里是泛指的意思下Conn)也没有实现 Execer,则 DB.Exec 将首先准备查询,执行语句,然后关闭语句。
ExecContext may return ErrSkip.
ExecContext 方法可以返回 ErrSkip。
ExecContext must honor the context timeout and return when the context is canceled.
ExecContext 方法必须遵守上下文超时,并在上下文取消时返回。
type IsolationLevel <- go1.8
|
|
IsolationLevel is the transaction isolation level stored in TxOptions.
IsolationLevel 是存储在 TxOptions 中的事务隔离级别。
This type should be considered identical to sql.IsolationLevel along with any values defined on it.
该类型应被视为与sql.IsolationLevel类型相同以及任何在其上定义的值。
type NamedValue <- go1.8
|
|
NamedValue holds both the value name and value.
NamedValue 持有值的名称和值。
type NamedValueChecker <- go1.9
|
|
NamedValueChecker 可以由 Conn 或 Stmt 可选实现。它为驱动程序提供了更多的控制权,以处理超出默认的 Value 类型允许的 Go 和数据库类型。
sql包会按照以下顺序检查值检查器,并在找到第一个匹配项时停止:Stmt.NamedValueChecker、Conn.NamedValueChecker、Stmt.ColumnConverter和DefaultParameterConverter。
如果CheckNamedValue返回ErrRemoveArgument,则NamedValue不会包含在最终查询参数中。这可用于向查询本身传递特殊选项。
如果返回ErrSkip,则对于该参数将使用列转换器错误检查路径。驱动程序可能会在耗尽其自己的特殊情况后返回ErrSkip。
type NotNull
|
|
NotNull结构体是一种类型,通过禁止nil值但否则委托给另一个ValueConverter来实现ValueConverter。
(NotNull) ConvertValue
|
|
type Null
|
|
Null 结构体是一个实现了 ValueConverter 接口的类型,它允许 nil 值,但除此之外会委托给另一个 ValueConverter。
(Null) ConvertValue
|
|
type Pinger <- go1.8
|
|
Pinger 是一个可选的接口,可以由 Conn(这里是泛指的意思下Conn) 实现。
如果一个 Conn(这里是泛指的意思下Conn) 没有实现 Pinger接口,那么 sql 包中的 DB.Ping 和 DB.PingContext 将检查是否至少有一个可用的 Conn。
如果 sql.Conn.Ping 方法返回 ErrBadConn,则sql.DB.Ping 方法和 sql.DB.PingContext 方法将从池中移除该 Conn。
type Queryer <-DEPRECATED
|
|
Queryer is an optional interface that may be implemented by a Conn.
If a Conn implements neither QueryerContext nor Queryer, the sql package’s DB.Query will first prepare a query, execute the statement, and then close the statement.
Query may return ErrSkip.
Deprecated: Drivers should implement QueryerContext instead.
type QueryerContext <- go1.8
|
|
QueryerContext是一个可选的接口,可以由Conn(这里是泛指的意思下Conn)实现。
如果Conn(这里是泛指的意思下Conn)未实现QueryerContext方法,则sql包的DB.Query方法将回退到Queryer;如果Conn(这里是泛指的意思下Conn)也未实现Queryer,则DB.Query方法将首先准备一个查询,执行语句,然后关闭语句。
QueryContext方法可能会返回ErrSkip。
QueryContext方法必须遵守上下文超时并在取消上下文时返回。
type Result
|
|
Result接口表示一个查询操作的结果。
type Rows
|
|
Rows接口是一个已执行查询的结果集迭代器。
type RowsAffected
|
|
RowsAffected 表示执行 INSERT 或 UPDATE 操作所影响的行数,实现了 Result 接口。
(RowsAffected) LastInsertId
|
|
(RowsAffected) RowsAffected
|
|
type RowsColumnTypeDatabaseTypeName <- go1.8
|
|
RowsColumnTypeDatabaseTypeName接口可以被Rows(这里是泛指的意思下Rows)实现。它应该返回数据库系统类型名称,但不包括长度信息。类型名称应大写。以下是各种类型的返回示例:“VARCHAR”、“NVARCHAR”、“VARCHAR2”、“CHAR”、“TEXT”、“DECIMAL”、“SMALLINT”、“INT”、“BIGINT”、“BOOL”、"[]BIGINT"、“JSONB”、“XML”、“TIMESTAMP”。
type RowsColumnTypeLength <- go1.8
|
|
RowsColumnTypeLength接口可以被Rows(这里是泛指的意思下Rows)实现。如果列是变长类型,则它应返回列类型的长度。如果列不是变长类型,则应该返回 false
。如果长度除系统限制外不受限制,则应返回 math.MaxInt64。以下是各种类型的返回值示例:
TEXT (math.MaxInt64, true)
varchar(10) (10, true)
nvarchar(10) (10, true)
decimal (0, false)
int (0, false)
bytea(30) (30, true)
type RowsColumnTypeNullable <- go1.8
|
|
RowsColumnTypeNullable 接口可以由Rows(这里是泛指的意思下Rows)实现。如果已知某列为可能为null,则该可空值的值为 true
;如果已知该列不可能为null,则该可空值的值为 false
。如果该列的可空值属性未知,则 ok
应为 false
。
type RowsColumnTypePrecisionScale <- go1.8
|
|
RowsColumnTypePrecisionScale 接口可以由Rows(这里是泛指的意思下Rows)实现。它应返回十进制类型的精度和小数位数。如果不适用,则应将ok
设置为false
。以下是各种类型的返回值示例:
decimal(38, 4) (38, 4, true)
int (0, 0, false)
decimal (math.MaxInt64, math.MaxInt64, true)
type RowsColumnTypeScanType <- go1.8
|
|
RowsColumnTypeScanType 接口可以由Rows(这里是泛指的意思下Rows) 实现。它应返回可以用于扫描类型的值类型。例如,对于数据库列类型"bigint",这应返回"reflect.TypeOf(int64(0))
"。
type RowsNextResultSet <- go1.8
|
|
RowsNextResultSet 接口通过提供一种方式来向驱动程序发出信号,使其前进到下一个结果集,从而扩展了 Rows 接口。
type SessionResetter <- go1.10
|
|
SessionResetter 可以由 Conn (这里是泛指的意思下Conn )实现,以允许驱动程序重置与连接关联的会话状态并发出不良连接信号。
type Stmt
|
|
Stmt接口是预处理语句。它绑定到一个Conn (这里是泛指的意思下Conn ),并且不能同时被多个goroutine使用。
type StmtExecContext <- go1.8
|
|
StmtExecContext接口通过提供带有上下文的Exec方法来增强Stmt接口。
type StmtQueryContext <- go1.8
|
|
StmtQueryContext接口通过提供带有上下文的Query方法来增强Stmt接口。
type Tx
|
|
Tx 是事务。
type TxOptions <- go1.8
|
|
TxOptions结构体存储事务的选项。
此类型应被认为与 sql.TxOptions 相同。
type Validator <- go1.15
|
|
Validator接口可以被 (这里是泛指的意思下Conn )实现,允许驱动程序发出信号,指示连接是否有效或是否应该被丢弃。
如果实现了 Validator,即使连接应该被丢弃,驱动程序也可以返回查询的基本错误。
type Value
|
|
Value类型是驱动程序必须能够处理的值。它可以是nil,也可以是数据库驱动程序的NamedValueChecker接口处理的类型,或者是这些类型之一的实例:
int64
float64
bool
[]byte
string
time.Time
如果驱动程序支持游标,则返回的 Value 还可以在此包中实现 Rows 接口。例如,当用户选择游标时,如 “select cursor(select * from my_table) from dual
",就会使用到这种情况。如果 select 中的 Rows (这里是泛指的意思下Rows )关闭了,游标 Rows (这里是泛指的意思下Rows )也会被关闭。
type ValueConverter
|
|
ValueConverter接口是提供 ConvertValue 方法的接口。
驱动程序包提供了 ValueConverter 的各种实现,以提供驱动程序之间的一致的转换实现。ValueConverter 有以下几个用途:
- 将 sql 包提供的 Value 类型转换为数据库表的特定列类型,并确保其适合,例如确保特定 int64 适合于表的 uint16 列。
- 将数据库中给定的值转换为驱动程序的一种 Value 类型。
- 由 sql 包使用,将驱动程序的 Value 类型转换为用户的类型进行扫描。
type Valuer
|
|
Valuer接口是提供 Value 方法的接口。
实现 Valuer 接口的类型能够将自身转换为驱动程序 Value。