Documentation ¶
Overview ¶
Package database 对实现标准库database/sql的接口的数据库进行封装 本包提供了DB作为数据库连接池来操作数据库 DB可以通过FetchRecord来获得每一行的记录,例如数据库方言名为name,数据库配置文件为conf
source, err := NewSource(name, conf) if err != nil { fmt.Println(err) return } db, err:= NewDB(source) if err != nil { fmt.Println(err) return } defer db.Close() t, err := db.FetchTable(context.TODO(), NewBaseTable("db", "schema", "table")) if err != nil { fmt.Println(err) return } var gotRecords []element.Record if err = db.FetchRecord(context.TODO(), NewTableQueryParam(t), NewBaseFetchHandler( func() (element.Record, error) { return element.NewDefaultRecord(), nil }, func(r element.Record) error { gotRecords = append(gotRecords, r) return nil })); err != nil { fmt.Println(err) return }
DB也可以通过BatchExec来批量处理数据
source, err := NewSource(name, conf) if err != nil { fmt.Println(err) return } db, err:= NewDB(source) if err != nil { fmt.Println(err) return } defer db.Close() t, err := db.FetchTable(context.TODO(), NewBaseTable("db", "schema", "table")) if err != nil { fmt.Println(err) return } columns := [][]element.Column{ { element.NewDefaultColumn(element.NewBoolColumnValue(false), "f1", 0), element.NewDefaultColumn(element.NewBigIntColumnValueFromInt64(1), "f2", 0), element.NewDefaultColumn(element.NewDecimalColumnValueFromFloat(1.0), "f3", 0), element.NewDefaultColumn(element.NewStringColumnValue("1"), "f4", 0), }, { element.NewDefaultColumn(element.NewBoolColumnValue(true), "f1", 0), element.NewDefaultColumn(element.NewBigIntColumnValueFromInt64(2), "f2", 0), element.NewDefaultColumn(element.NewDecimalColumnValueFromFloat(2.0), "f3", 0), element.NewDefaultColumn(element.NewStringColumnValue("2"), "f4", 0), }, } var wantRecords []element.Record for _, row := range columns { record := element.NewDefaultRecord() for _, c := range row { record.Add(c) } wantRecords = append(wantRecords, record) } if err = db.BatchExec(context.TODO(), &ParameterOptions{ Table: gotTable, TxOptions: nil, Mode: "insert", Records: wantRecords, }); err != nil { fmt.Println(err) return }
DB也可以像sql.DB那样通过BeginTx,QueryContext,ExecContext去实现操作数据库的要求 另外database包提供了DBWrapper使得数据库连接池能够被复用 它实际上是DB的包装,为此它可以表现的和DB一样,例如
db, err:= Open(name, conf) if err != nil { fmt.Println(err) return } defer db.Close() t, err := db.FetchTable(context.TODO(), NewBaseTable("db", "schema", "table")) if err != nil { fmt.Println(err) return }
要使用上述特性,各类实现标准库database/sql的接口的数据库 通过RegisterDialect通过名字注册一下数据库方言接口 当然数据库配置文件要满足Config的格式
type Dialect interface { Source(*BaseSource) (Source, error) }
数据库方言接口主要是返回数据源接口
type Source interface { Config() *config.JSON //配置信息 Key() string //dbMap Key DriverName() string //驱动名,用于sql.Open ConnectName() string //连接信息,用于sql.Open Table(*BaseTable) Table //获取具体表 }
当然这里可以使用BaseSource来简化Source的实现 数据源接口返回对应的表 Table 表结构
type Table interface { fmt.Stringer Quoted() string //引用的表名全称 Instance() string //实例名,例如对于mysql就是数据库,对于oracle就是实例 Schema() string //模式名,例如对于mysql就是数据库,对于oracle就是用户名 Name() string //表名,例如对于mysql就是表 Fields() []Field //显示所有列 }
当Table一般实现基本的添加列接口用于FetchTable
type FieldAdder interface { AddField(*BaseField) //新增具体列 }
如果有特别的SQL获取列方式,则需要实现下列接口去获取
type FieldsFetcher interface { FetchFields(ctx context.Context, db *DB) error //获取具体列 }
如果在批量处理数据时需要除了insert批量处理数据的语句,或者特殊的insert语句时,还需要实现下列接口
type ExecParameter interface { ExecParam(string, *sql.TxOptions) (Parameter, bool) }
通过传入写入模式字符串以及事务选项获取执行参数 当然这里也可以使用BaseTable来简化Table的实现 每个表包含多列Field
type Field interface { fmt.Stringer Name() string //字段名 Quoted() string //引用字段名 BindVar(int) string //占位符号 Select() string //select字段名 Type() FieldType //字段类型 Scanner() Scanner //扫描器 Valuer(element.Column) Valuer //赋值器 }
当然这里可以使用BaseField来简化Field的实现 这里接口FieldType时sql.ColumnType抽象,一般无需自己实现 ,如有特殊的需求也可以实现这个接口用于自己的列类型
type FieldType interface { Name() string //列名 ScanType() reflect.Type //扫描类型 Length() (length int64, ok bool) //长度 DecimalSize() (precision, scale int64, ok bool) //精度 Nullable() (nullable, ok bool) //是否为空 DatabaseTypeName() string //列数据库类型名 }
扫描器接口Scanner是将数据库驱动底层的数据转化成列Column类型,用于读取数据
type Scanner interface { sql.Scanner Column() element.Column //获取列数据 }
当然这里可以使用BaseScanner来简化Scanner的实现 赋值器接口Valuer是将列Column数据库转化成驱动底层的数据,用于处理数据
type Valuer interface { driver.Valuer }
特别地,如果使用GoValuer来作为赋值器Valuer的简单实现 那么需要在FieldType的基础上简单实现下列接口就可以实现对应的Valuer
type ValuerGoType interface { GoType() GoType }
通过上述内容的实现,我们就可以愉快的使用数据库
Index ¶
- Constants
- Variables
- func RegisterDialect(name string, dialect Dialect)
- func UnregisterAllDialects()
- type BaseFetchHandler
- type BaseField
- type BaseFieldType
- type BaseParam
- type BaseScanner
- type BaseSource
- type BaseTable
- type ColumnType
- type Config
- type DB
- func (d *DB) BatchExec(ctx context.Context, opts *ParameterOptions) (err error)
- func (d *DB) BatchExecStmt(ctx context.Context, opts *ParameterOptions) (err error)
- func (d *DB) BatchExecStmtWithTx(ctx context.Context, opts *ParameterOptions) (err error)
- func (d *DB) BatchExecWithTx(ctx context.Context, opts *ParameterOptions) (err error)
- func (d *DB) BeginTx(ctx context.Context, opts *sql.TxOptions) (*sql.Tx, error)
- func (d *DB) Close() (err error)
- func (d *DB) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error)
- func (d *DB) FetchRecord(ctx context.Context, param Parameter, handler FetchHandler) (err error)
- func (d *DB) FetchRecordWithTx(ctx context.Context, param Parameter, handler FetchHandler) (err error)
- func (d *DB) FetchTable(ctx context.Context, t *BaseTable) (Table, error)
- func (d *DB) FetchTableWithParam(ctx context.Context, param Parameter) (Table, error)
- func (d *DB) PingContext(ctx context.Context) error
- func (d *DB) QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error)
- type DBWrapper
- type Dialect
- type ExecParameter
- type FetchHandler
- type Field
- type FieldAdder
- type FieldType
- type FieldsFetcher
- type GoType
- type GoValuer
- type InsertParam
- type Judger
- type Parameter
- type ParameterOptions
- type PoolConfig
- type Scanner
- type Source
- type Table
- type TableConfigSetter
- type TableQueryParam
- type Valuer
- type ValuerGoType
- type WithConnector
Constants ¶
const ( DefaultMaxOpenConns = 4 DefaultMaxIdleConns = 4 )
默认参数
const (
WriteModeInsert = "insert"
)
写入数据库模式
Variables ¶
var (
ErrNotValuerGoType = errors.New("field type is not ValuerGoType") //接口不是ValuerGoType的错误
)
字段错误相关
Functions ¶
func RegisterDialect ¶
RegisterDialect 注册数据库方言,当注册名称相同或者dialect为空时会panic
Types ¶
type BaseFetchHandler ¶
type BaseFetchHandler struct {
// contains filtered or unexported fields
}
BaseFetchHandler 基础获取记录句柄
func NewBaseFetchHandler ¶
func NewBaseFetchHandler(createRecord func() (element.Record, error), onRecord func(element.Record) error) *BaseFetchHandler
NewBaseFetchHandler 创建基础获取记录句柄
func (*BaseFetchHandler) CreateRecord ¶
func (b *BaseFetchHandler) CreateRecord() (element.Record, error)
CreateRecord 创建记录
type BaseField ¶
type BaseField struct {
// contains filtered or unexported fields
}
BaseField 基础字段,主要存储列名name和列类型fieldType
func NewBaseField ¶
NewBaseField 根据列名name和列类型fieldType获取基础字段 用于嵌入其他Field,方便实现各个数据库的Field
type BaseFieldType ¶
type BaseFieldType struct {
ColumnType
}
BaseFieldType 基础字段类型,嵌入其他各种数据库字段类型实现
func NewBaseFieldType ¶
func NewBaseFieldType(typ ColumnType) *BaseFieldType
NewBaseFieldType 获取字段类型
type BaseParam ¶
type BaseParam struct {
// contains filtered or unexported fields
}
BaseParam 基础参数,用于嵌入各类数据库sql参数的
func NewBaseParam ¶
NewBaseParam 通过表table和事务参数txOps生成基础参数
type BaseScanner ¶
type BaseScanner struct {
// contains filtered or unexported fields
}
BaseScanner 基础扫描器,嵌入其他各种数据库扫描器实现
func (*BaseScanner) SetColumn ¶
func (b *BaseScanner) SetColumn(c element.Column)
SetColumn 设置列值,用于数据库方言的列数据设置
type BaseSource ¶
type BaseSource struct {
// contains filtered or unexported fields
}
BaseSource 基础数据源,用于存储json配置文件 用于嵌入Source,方便实现各个数据库的Field
func NewBaseSource ¶
func NewBaseSource(conf *config.JSON) *BaseSource
NewBaseSource 通过json配置文件conf生成基础数据源
type BaseTable ¶
type BaseTable struct {
// contains filtered or unexported fields
}
BaseTable 基本表,用于嵌入各种数据库Table的实现
func NewBaseTable ¶
NewBaseTable ,通过实例名,模式名,表明获取基本表
type ColumnType ¶
type ColumnType interface { Name() string //列名 ScanType() reflect.Type //扫描类型 Length() (length int64, ok bool) //长度 DecimalSize() (precision, scale int64, ok bool) //精度 Nullable() (nullable, ok bool) //是否为空 DatabaseTypeName() string //列数据库类型名 }
ColumnType 列类型,抽象 sql.ColumnType,也方便自行实现对应函数
type DB ¶
type DB struct { Source // contains filtered or unexported fields }
DB 用户维护数据库连接池
func (*DB) BatchExec ¶
func (d *DB) BatchExec(ctx context.Context, opts *ParameterOptions) (err error)
BatchExec 批量执行sql并处理多行记录
func (*DB) BatchExecStmt ¶
func (d *DB) BatchExecStmt(ctx context.Context, opts *ParameterOptions) (err error)
BatchExecStmt 批量prepare/exec执行sql并处理多行记录
func (*DB) BatchExecStmtWithTx ¶
func (d *DB) BatchExecStmtWithTx(ctx context.Context, opts *ParameterOptions) (err error)
BatchExecStmtWithTx 批量事务prepare/exec执行sql并处理多行记录
func (*DB) BatchExecWithTx ¶
func (d *DB) BatchExecWithTx(ctx context.Context, opts *ParameterOptions) (err error)
BatchExecWithTx 批量事务执行sql并处理多行记录
func (*DB) ExecContext ¶
func (d *DB) ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error)
ExecContext 执行query并获取结果
func (*DB) FetchRecord ¶
FetchRecord 通过上下文ctx,sql参数param以及记录处理函数onRecord 获取多行记录返回错误
func (*DB) FetchRecordWithTx ¶
func (d *DB) FetchRecordWithTx(ctx context.Context, param Parameter, handler FetchHandler) (err error)
FetchRecordWithTx 通过上下文ctx,sql参数param以及记录处理函数onRecord 使用事务获取多行记录并返回错误
func (*DB) FetchTable ¶
FetchTable 通过上下文ctx和基础表数据t,获取对应的表并会返回错误
func (*DB) FetchTableWithParam ¶
FetchTableWithParam 通过上下文ctx和sql参数param,获取对应的表并会返回错误
func (*DB) PingContext ¶
PingContext 通过query查询多行数据
type DBWrapper ¶
type DBWrapper struct { *DB // contains filtered or unexported fields }
DBWrapper 数据库连接池包装,用于复用相关的数据库连接池(单元到实例:user)
type ExecParameter ¶
ExecParameter Table的补充方法,用于写模式获取生成sql语句的方法
type FetchHandler ¶
type FetchHandler interface { OnRecord(element.Record) error CreateRecord() (element.Record, error) }
FetchHandler 获取记录句柄
type Field ¶
type Field interface { fmt.Stringer Index() int //索引 Name() string //字段名 Quoted() string //引用字段名 BindVar(int) string //占位符号, 从1开始 Select() string //select字段名 Type() FieldType //字段类型 Scanner() Scanner //扫描器 Valuer(element.Column) Valuer //赋值器 }
Field 数据库字段
type FieldAdder ¶
type FieldAdder interface {
AddField(*BaseField) //新增具体列
}
FieldAdder Table的补充方法,用于新增表的列
type FieldsFetcher ¶
FieldsFetcher Table的补充方法,用于特殊获取表的所有列
type GoType ¶
type GoType uint8
GoType golang的类型
type GoValuer ¶
type GoValuer struct {
// contains filtered or unexported fields
}
GoValuer 使用GoType类型生成赋值器,主要通过字段f和传入参数列值c来 完成使用GoType类型生成赋值器,方便实现GoValuer
func NewGoValuer ¶
NewGoValuer 主要通过字段f和传入参数列值c来完成使用GoType类型生成赋值器的生成
type InsertParam ¶
type InsertParam struct {
*BaseParam
}
InsertParam 插入参数
func NewInsertParam ¶
func NewInsertParam(t Table, txOps *sql.TxOptions) *InsertParam
NewInsertParam 通过表table和事务参数txOps插入参数
type Judger ¶
type Judger interface { schedule.RetryJudger ShouldOneByOne(err error) bool }
Judger 错误判断器
type Parameter ¶
type Parameter interface { SetTable(Table) //设置表或者视图 Table() Table //表或者视图 TxOptions() *sql.TxOptions //事务模式 Query([]element.Record) (string, error) //sql prepare语句 Agrs([]element.Record) ([]interface{}, error) //prepare参数 }
Parameter 带有表,事务模式,sql语句的执行参数
type ParameterOptions ¶
type ParameterOptions struct { Table Table //表或者视图 Mode string //写入模式,例如mysql TxOptions *sql.TxOptions //事务模式 Records []element.Record //写入行 }
ParameterOptions 参数选项
type PoolConfig ¶
type PoolConfig struct { MaxOpenConns int `json:"maxOpenConns"` //最大打开连接数 MaxIdleConns int `json:"maxIdleConns"` //最大空闲时连接数 ConnMaxIdleTime time2.Duration `json:"connMaxIdleTime"` //最大连接空闲时间 ConnMaxLifetime time2.Duration `json:"connMaxLifetime"` //最大连接存活时间 }
PoolConfig 数据库连接池配置 一般让最大打开连接数和最大空闲时连接数一致,否则会导致释放连接不及导致文件数不足
func (*PoolConfig) GetMaxIdleConns ¶
func (c *PoolConfig) GetMaxIdleConns() int
GetMaxIdleConns 获取空闲时最大连接数,默认返回为4
func (*PoolConfig) GetMaxOpenConns ¶
func (c *PoolConfig) GetMaxOpenConns() int
GetMaxOpenConns 获取最大连接数,默认返回值为4
type Source ¶
type Source interface { Config() *config.JSON //配置信息 Key() string //一般是连接信息 DriverName() string //驱动名,用于sql.Open的第1个参数 ConnectName() string //连接信息,用于sql.Open的第2个参数 Table(*BaseTable) Table //获取具体表 }
Source 数据源,包含驱动信息,包信息,配置文件以及连接信息
type Table ¶
type Table interface { fmt.Stringer Quoted() string //引用的表名全称 Instance() string //实例名,例如对于mysql就是数据库 Schema() string //模式名,例如对于oracle就是用户名(模式名) Name() string //表名,例如对于mysql就是表 Fields() []Field //显示所有列 }
Table 表结构
type TableConfigSetter ¶
TableConfigSetter Table的补充方法,用于设置json配置文件
type TableQueryParam ¶
type TableQueryParam struct {
*BaseParam
}
TableQueryParam 表结构查询参数
func NewTableQueryParam ¶
func NewTableQueryParam(table Table) *TableQueryParam
NewTableQueryParam 通过表Table生成表结构查询参数
type ValuerGoType ¶
type ValuerGoType interface {
GoType() GoType
}
ValuerGoType 用于赋值器的golang类型判定,是Field的可选功能, 就是对对应驱动的值返回相应的值,方便GoValuer进行判定
type WithConnector ¶
WithConnector 带有连接的数据源, 数据源优先调用该方法生成数据连接池DB
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
Package db2 实现了db2的数据库方言Dialect,支持db2 10.x+ 对应数据库
|
Package db2 实现了db2的数据库方言Dialect,支持db2 10.x+ 对应数据库 |
Package mysql 实现了mysql的数据库方言Dialect,支持mysql 5.6+ 对应数据库 驱动为github.com/go-sql-driver/mysql 数据源Source使用BaseSource来简化实现, 对github.com/go-sql-driver/mysql 驱动进行包装.对于数据库配置,需要和Config一致 表Table使用BaseTable来简化实现,也是基于github.com/go-sql-driver/mysql的 封装,Table实现了FieldAdder的方式去获取列,在ExecParameter中实现写入模式为 replace的repalce into批量数据处理模式,写入模式为insert的插入模式复用 已有的database.InsertParam 列Field使用BaseField来简化实现,其中FieldType采用了原来的sql.ColumnType, 并实现了ValuerGoType 扫描器Scanner使用BaseScanner来简化实现 赋值器Valuer 使用了GoValuer的实现方式
|
Package mysql 实现了mysql的数据库方言Dialect,支持mysql 5.6+ 对应数据库 驱动为github.com/go-sql-driver/mysql 数据源Source使用BaseSource来简化实现, 对github.com/go-sql-driver/mysql 驱动进行包装.对于数据库配置,需要和Config一致 表Table使用BaseTable来简化实现,也是基于github.com/go-sql-driver/mysql的 封装,Table实现了FieldAdder的方式去获取列,在ExecParameter中实现写入模式为 replace的repalce into批量数据处理模式,写入模式为insert的插入模式复用 已有的database.InsertParam 列Field使用BaseField来简化实现,其中FieldType采用了原来的sql.ColumnType, 并实现了ValuerGoType 扫描器Scanner使用BaseScanner来简化实现 赋值器Valuer 使用了GoValuer的实现方式 |
Package oracle 实现了oracle的数据库方言Dialect,支持oracle 10.5+ 对应数据库
|
Package oracle 实现了oracle的数据库方言Dialect,支持oracle 10.5+ 对应数据库 |
Package postgres 实现了postgres的数据库方言Dialect,支持postgres 8.0+ 对应数据库
|
Package postgres 实现了postgres的数据库方言Dialect,支持postgres 8.0+ 对应数据库 |
Package sqlserver 实现了sqlserver的数据库方言Dialect,支持mssql 2005+ 对应数据库
|
Package sqlserver 实现了sqlserver的数据库方言Dialect,支持mssql 2005+ 对应数据库 |