Documentation ¶
Overview ¶
Package core 核心功能
Index ¶
- Constants
- Variables
- func ErrConstraintExists(c string) error
- type ApplyModeler
- type Builder
- func (b *Builder) Append(v *Builder) *Builder
- func (b *Builder) Bytes() ([]byte, error)
- func (b *Builder) Err() error
- func (b *Builder) Len() int
- func (b *Builder) Quote(str string, l, r byte) *Builder
- func (b *Builder) QuoteKey(str string) *Builder
- func (b *Builder) Reset() *Builder
- func (b *Builder) String() (string, error)
- func (b *Builder) TruncateLast(n int) *Builder
- func (b *Builder) WBytes(c ...byte) *Builder
- func (b *Builder) WRunes(r ...rune) *Builder
- func (b *Builder) WString(str string) *Builder
- type Column
- type Constraint
- type ConstraintType
- type Dialect
- type Engine
- type ForeignKey
- type IndexType
- type Model
- func (m *Model) AddColumn(col *Column) error
- func (m *Model) AddColumns(col ...*Column) error
- func (m *Model) AddIndex(typ IndexType, name string, col *Column) error
- func (m *Model) AddPrimaryKey(col *Column) error
- func (m *Model) AddUnique(name string, col *Column) error
- func (m *Model) FindColumn(name string) *Column
- func (m *Model) ForeignKey(name string) (*ForeignKey, bool)
- func (m *Model) Index(name string) (*Constraint, bool)
- func (m *Model) NewCheck(name string, expr string) error
- func (m *Model) NewForeignKey(fk *ForeignKey) error
- func (m *Model) Reset()
- func (m *Model) Sanitize() error
- func (m *Model) SetAutoIncrement(col *Column) error
- func (m *Model) SetOCC(col *Column) error
- func (m *Model) Unique(name string) (*Constraint, bool)
- type ModelType
- type PrimitiveType
- type PrimitiveTyper
- type Stmt
- func (stmt *Stmt) Close() error
- func (stmt *Stmt) Exec(args ...any) (sql.Result, error)
- func (stmt *Stmt) ExecContext(ctx context.Context, args ...any) (sql.Result, error)
- func (stmt *Stmt) Query(args ...any) (*sql.Rows, error)
- func (stmt *Stmt) QueryContext(ctx context.Context, args ...any) (*sql.Rows, error)
- func (stmt *Stmt) QueryRow(args ...any) *sql.Row
- func (stmt *Stmt) QueryRowContext(ctx context.Context, args ...any) *sql.Row
- type TableNamer
- type Viewer
Constants ¶
const ( QuoteLeft = '{' QuoteRight = '}' )
作用于表名,列名等非关键字上的引号占位符。 在执行会自动替换成该数据相应的符号。
const TimeFormatLayout = time.RFC3339
TimeFormatLayout 时间如果需要转换成字符串采用此格式
Variables ¶
var ( // ErrAutoIncrementPrimaryKeyConflict 自增和主键不能同时存在 // // 当添加自增时,会自动将其转换为主键,如果此时已经已经存在主键,则会报此错误。 ErrAutoIncrementPrimaryKeyConflict = errors.New("自增和主键不能同时存在") )
var ErrInvalidColumnType = errors.New("无效的列类型")
ErrInvalidColumnType 无效的列类型
作为列类型,该数据类型必须是可序列化的。 像 reflect.Func、reflect.Chan 等类型的数据都将返回该错误。
Functions ¶
func ErrConstraintExists ¶
ErrConstraintExists 返回约束名已经存在的错误
Types ¶
type ApplyModeler ¶
ApplyModeler 加载数据模型
当一个对象实现此接口时,那么在将对象转换成 Model 类型时, 会调用 ApplyModel 方法,给予用户修改 Model 的机会。
type Builder ¶
type Builder struct {
// contains filtered or unexported fields
}
Builder 用于构建 SQL 语句
出错时,错误信息会缓存,并在 Builder.String 或 Builder.Bytes 时返回, 或是通过 Builder.Err 查看是否存在错误。
type Column ¶
type Column struct { Name string // 数据库的字段名 AI bool Nullable bool HasDefault bool Default any Length []int PrimitiveType PrimitiveType GoName string // Go 中的字段名 }
Column 列结构
type Constraint ¶
type ConstraintType ¶
type ConstraintType int8
const ( ConstraintNone ConstraintType = iota ConstraintUnique // 唯一约束 ConstraintFK // 外键约束 ConstraintCheck // Check 约束 ConstraintPK // 主键约束 )
约束类型
以下定义了一些常用的约束类型,但是并不是所有的数据都支持这些约束类型, 比如 mysql<8.0.16 和 mariadb<10.2.1 不支持 check 约束。
type Dialect ¶
type Dialect interface { // DBName 当前关联的数据库名称 // // 数据库名称和驱动名未必相同。比如 mysql 和 mariadb 可能采用相同的驱动名; DBName() string // DriverName 与当前实例关联的驱动名称 // // 原则上驱动名和 Dialect 应该是一一对应的,但是也会有例外,比如: // github.com/lib/pq 和 github.com/jackc/pgx/v4/stdlib 功能上是相同的, // 仅注册的名称的不同。 DriverName() string Quotes() (left, right byte) // SQLType 将列转换成数据支持的类型表达式 // // 必须实现对所有 PrimitiveType 类型的转换。 SQLType(*Column) (string, error) // TransactionalDDL 是否允许在事务中执行 DDL // // 比如在 postgresql 中,如果创建一个带索引的表,会采用在事务中, // 分多条语句创建表。 // 而像 mysql 等不支持事务内 DDL 的数据库,则会采用普通的方式, // 依次提交语句。 TransactionalDDL() bool // VersionSQL 查询服务器版本号的 SQL 语句 VersionSQL() string // ExistsSQL 查询数据库中是否存在指定名称的表或是视图 SQL 语句 // // 返回的 SQL语句中,其执行结果如果存在,则应该返回 name 字段表示表名,否则返回空。 ExistsSQL(name string, view bool) (string, []any) // LimitSQL 生成 `LIMIT N OFFSET M` 或是相同的语意的语句片段 // // offset 值为一个可选参数,若不指定,则表示 `LIMIT N` 语句。 // 返回的是对应数据库的 limit 语句以及语句中占位符对应的值。 // // limit 和 offset 可以是 SQL.NamedArg 类型。 LimitSQL(limit any, offset ...any) (string, []any) // LastInsertIDSQL 自定义获取 LastInsertID 的获取方式 // // 类似于 postgresql 等都需要额外定义。 // // sql 表示额外的语句,如果为空,则执行的是标准的 SQL 插入语句; // append 表示在 sql 不为空的情况下,sql 与现有的插入语句的结合方式, // 如果为 true 表示直接添加在插入语句之后,否则为一条新的语句。 LastInsertIDSQL(table, col string) (sql string, append bool) // CreateTableOptionsSQL 创建表时根据附加信息返回的部分 SQL 语句 CreateTableOptionsSQL(sql *Builder, options map[string][]string) error // TruncateTableSQL 生成清空数据表并重置自增列的语句 // // ai 表示自增列的名称,可以为空,表示没有自去列。 TruncateTableSQL(table, ai string) ([]string, error) // CreateViewSQL 生成创建视图的 SQL 语句 CreateViewSQL(replace, temporary bool, name, selectQuery string, cols []string) ([]string, error) // DropIndexSQL 生成删除索引的语句 // // table 为表名,部分数据库需要; // index 表示索引名; DropIndexSQL(table, index string) (string, error) // Fix 对 sql 语句作调整 // // 比如处理 sql.NamedArgs,postgresql 需要将 ? 改成 $1 等形式。 // 以及对 args 的参数作校正,比如 lib/pq 对 time.Time 处理有问题,也可以在此处作调整。 // // NOTE: query 中不能同时存在 ? 和命名参数。因为如果是命名参数,则 args 的顺序可以是随意的。 Fix(query string, args []any) (string, []any, error) // Prepare 对预编译的内容进行处理 // // 目前大部分驱动都不支持 sql.NamedArgs,为了支持该功能, // 需要在预编译之前,对语句进行如下处理: // 1. 将 sql 中的 @xx 替换成 ? // 2. 将 sql 中的 @xx 在 sql 中的位置进行记录,并通过 orders 返回。 // query 为处理后的 SQL 语句; // orders 为参数名在 query 中对应的位置,第一个位置为 0,依次增加。 // // NOTE: query 中不能同时存在 ? 和命名参数。因为如果是命名参数,则 Exec 等的参数顺序可以是随意的。 Prepare(sql string) (query string, orders map[string]int, err error) }
Dialect 用于描述与数据库和驱动相关的一些特性
Dialect 的实现者除了要实现 Dialect 之外, 还需要根据数据库的支持情况实现 sqlbuilder 下的部分 *Hooker 接口。
type Engine ¶
type Engine interface { Dialect() Dialect Query(query string, args ...any) (*sql.Rows, error) QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error) QueryRow(query string, args ...any) *sql.Row QueryRowContext(ctx context.Context, query string, args ...any) *sql.Row Exec(query string, args ...any) (sql.Result, error) ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error) Prepare(query string) (*Stmt, error) PrepareContext(ctx context.Context, query string) (*Stmt, error) }
Engine 数据库执行的基本接口
orm.DB 和 orm.Tx 应该实现此接口。
type ForeignKey ¶
type ForeignKey struct { Name string // 约束名 Column *Column RefTableName, RefColName string UpdateRule, DeleteRule string }
ForeignKey 外键
type Model ¶
type Model struct { GoType reflect.Type // 模型的名称 Name string // 如果当前模型是视图,那么此值表示的是视图的 select 语句, // 其它类型下,ViewAs 不启作用。 ViewAs string Type ModelType Columns []*Column // 约束与索引 // // NOTE: 如果是视图模式,理论上是不存在约束信息的, // 但是依然可以指定约束,这些信息主要是给 ORM 查看,以便构建搜索语句。 Checks map[string]string ForeignKeys []*ForeignKey Indexes []*Constraint // 目前不支持唯一索引,如果需要唯一索引,可以设置成唯一约束。 Uniques []*Constraint AutoIncrement *Column PrimaryKey *Constraint OCC *Column // 乐观锁 // 表级别的数据 // // 如存储引擎,表名和字符集等,在创建表时,可能会用到这此数据。 // 可以采用 dialect.DBName 限定数据库,比如 mysql_charset 限定为 mysql 下的 charset 属性。 // 具体可参考各个 dialect 实现的介绍。 Options map[string][]string }
Model 表示一个数据库的表或视图模型
func (*Model) AddIndex ¶
AddIndex 添加索引列
如果 name 不存在,则创建新的索引
NOTE: 如果 typ == IndexUnique,则等同于调用 AddUnique。
func (*Model) ForeignKey ¶
func (m *Model) ForeignKey(name string) (*ForeignKey, bool)
func (*Model) NewForeignKey ¶
func (m *Model) NewForeignKey(fk *ForeignKey) error
NewForeignKey 添加新的外键
type ModelType ¶
type ModelType int8
ModelType 表示数据模型的类别
const ( Table ModelType View )
目前支持的数据模型类别
Table 表示为一张普通的数据表,默认的模型即为 Table; 如果实现了 Viewer 接口,则该模型改变视图类型,即 View。
两者的创建方式稍微有点不同: Table 类型创建时,会采用列、约束和索引等信息创建表; 而 View 创建时,只使用了 Viewer 接口返回的 Select 语句作为内容生成语句,像约束等信息,仅作为查询时的依据, 当然 select 语句中的列需要和 Columns 中的列要相对应, 否则可能出错。
在视图类型中,唯一约束、主键约束、自增约束依然是可以定义的, 虽然不会呈现在视图中,但是在查询时,可作为 orm 的一个判断依据。
type PrimitiveType ¶
type PrimitiveType int
PrimitiveType 表示 Go 对象在数据库中实际的存储方式
PrimitiveType 由 Dialect.SQLType 转换成相应数据的实际类型。
const ( Auto PrimitiveType = iota Bool Int Int8 Int16 Int32 Int64 Uint Uint8 Uint16 Uint32 Uint64 Float32 Float64 String Bytes Time Decimal )
当前支持的 PrimitiveType 值
其中的 String 被设计成可以保存部分类型为 reflect.Interface 的数据结构, 但是一个有限的集合,比如将一个 any 字段赋予 slice 类型的数,在保存时可会不被支持。 且在读取时,各个数据库略有不同,比如 mysql 返回 []byte,而其它数据一般返回 string。
func GetPrimitiveType ¶
func GetPrimitiveType(t reflect.Type) PrimitiveType
GetPrimitiveType 获取 t 所关联的 PrimitiveType 值
t.Kind 不能为 reflect.Ptr 否则将返回 Auto。
func (PrimitiveType) String ¶
func (t PrimitiveType) String() string
type PrimitiveTyper ¶
type PrimitiveTyper interface { // PrimitiveType 返回当前对象所表示的 PrimitiveType 值 // // NOTE: 每个对象在任何时间返回的值应该都是固定的。 PrimitiveType() PrimitiveType }
type Stmt ¶
Stmt 实现自定义的 Stmt 实例
功能与 sql.Stmt 完全相同,但是实现了对 sql.NamedArgs 的支持。
func NewStmt ¶
NewStmt 声明 Stmt 实例
如果 orders 为空,则 Stmt 的表现和 sql.Stmt 是完全相同的, 如果不为空,则可以处理 sql.NamedArg 类型的参数。
func (*Stmt) ExecContext ¶
ExecContext 以指定的参数执行预编译的语句
func (*Stmt) QueryContext ¶
QueryContext 以指定的参数执行预编译的语句
type TableNamer ¶
type TableNamer interface { // TableName 返回表或是视图的名称 TableName() string }
TableNamer 表或是视图必须实现的接口