Documentation
¶
Overview ¶
Package core 定义了 dbx 的领域层接口与核心类型。 它提供了纯抽象接口、Row/Rows 数据结构、绑定变量工具 以及不依赖具体数据库实现的扫描与查询函数。
Index ¶
- Constants
- Variables
- func BindDriver(driverName string, bindType int)
- func BindType(driverName string) int
- func FieldsByTraversal(v reflect.Value, traversals [][]int, values []any, ptrs bool) error
- func Get(q Queryer, dest any, query string, args ...any) error
- func In(query string, args ...any) (string, []any, error)
- func IsScannable(t reflect.Type) bool
- func MapScan(r ColScanner, dest map[string]any) error
- func Mapper() *reflectx.Mapper
- func MustExec(e Execer, query string, args ...any) sql.Result
- func Rebind(bindType int, query string) string
- func RebindBuff(bindType int, query string) string
- func ScanAll(rows Rowsi, dest any, structOnly bool, unsafe bool) error
- func Select(q Queryer, dest any, query string, args ...any) error
- func SetLogMode(m LogMode)
- func SetLogger(l Logger)
- func SliceScan(r ColScanner) ([]any, error)
- func StructScan(rows Rowsi, dest any) error
- type Binder
- type ColScanner
- type Execer
- type Ext
- type LogEntry
- type LogMode
- type Logger
- type Preparer
- type Queryer
- type Row
- func (r *Row) ColumnTypes() ([]*sql.ColumnType, error)
- func (r *Row) Columns() ([]string, error)
- func (r *Row) Err() error
- func (r *Row) MapScan(dest map[string]any) error
- func (r *Row) Scan(dest ...any) error
- func (r *Row) ScanAny(dest any, structOnly bool) error
- func (r *Row) SliceScan() ([]any, error)
- func (r *Row) StructScan(dest any) error
- type Rows
- type Rowsi
Constants ¶
const ( UNKNOWN = iota // 未知绑定类型 QUESTION // 问号绑定类型 ? DOLLAR // 美元符号绑定类型 $ NAMED // 命名参数绑定类型 :name AT // @ 符号绑定类型 @name )
Variables ¶
var ErrMultiRows = errors.New("sql: multiple rows returned")
ErrMultiRows 在预期只返回单行的函数(如 Get)实际返回多行时返回。 这通常表示查询缺少 join 条件或 limit 条件,或本应使用 Select。
var NameMapper = strings.ToLower
NameMapper 用于将列名映射到结构体字段名。默认情况下, 它使用 strings.ToLower 将结构体字段名转为小写。
Functions ¶
func BindDriver ¶
BindDriver 将 driverName 的 BindType 设置为 bindType
func FieldsByTraversal ¶
FieldsByTraversal 根据 traversals 中的路径,用传递的 value 的字段填充 values 接口切片。
func In ¶
In 展开 args 中的切片值,返回修改后的查询字符串和新的参数列表。 使用词法分析器定位 `?`,仅对 `IN (...)` 中的占位符展开切片, 并忽略字符串/注释中的问号。
func MapScan ¶
func MapScan(r ColScanner, dest map[string]any) error
MapScan 将单行扫描到 dest map[string]any 中。
func RebindBuff ¶
RebindBuff 是 Rebind 的实验性实现,使用 bytes.Buffer。 代码更简单,应当更能抵抗奇特的 unicode,但速度慢两倍。
Types ¶
type Binder ¶
type Binder interface {
DriverName() string
Rebind(string) string
BindNamed(string, any) (string, []any, error)
}
Binder 是能够绑定查询的接口。
type ColScanner ¶
ColScanner 是 MapScan 和 SliceScan 使用的接口。
type LogEntry ¶
type LogEntry struct {
Operation string // 操作类型:Exec / Query / QueryRow
Query string // 执行的 SQL
Args []any // 参数
Duration time.Duration // 耗时
Err error // 错误(nil 表示成功)
RowsAffected int64 // 影响行数(查询时为 -1)
}
LogEntry 描述一次 SQL 执行。
type Logger ¶
type Logger interface {
// LogSQL 记录一次 SQL 执行。仅在 LogDebug 模式下被调用。
LogSQL(entry LogEntry)
}
Logger 是 SQL 日志接口,由使用方实现以适配自身日志库。
type Queryer ¶
type Queryer interface {
Query(query string, args ...any) (*sql.Rows, error)
Queryx(query string, args ...any) (*Rows, error)
QueryRowx(query string, args ...any) *Row
}
Queryer 是 Get 和 Select 使用的接口。
type Row ¶
type Row struct {
Unsafe bool
Rows *sql.Rows
Mapper *reflectx.Mapper
// contains filtered or unexported fields
}
Row 是对 sql.Row 的重新实现,目的是能够访问底层 sql.Rows.Columns() 数据, 这是 StructScan 所必需的。
func (*Row) ColumnTypes ¶
func (r *Row) ColumnTypes() ([]*sql.ColumnType, error)
ColumnTypes 返回底层 sql.Rows.ColumnTypes(),或延迟错误。
type Rows ¶
type Rows struct {
*sql.Rows
Unsafe bool
Mapper *reflectx.Mapper
// contains filtered or unexported fields
}
Rows 是 sql.Rows 的封装,在循环 StructScan 期间缓存高开销的反射操作。
func (*Rows) NextResultSet ¶
NextResultSet 移动到下一个结果集,并重置字段缓存, 避免多语句查询时复用上一个结果集的列映射。
func (*Rows) StructScan ¶
StructScan 将单行扫描到单个结构体中。 当 Select() 的内存负载可能过高时,使用此方法手动迭代 Rows。