Documentation ¶
Overview ¶
Package pgears 的 Engine 包中包含了对外的基本接口。核心是 Engine 类型,它可以用于单个对象的CURD操作,也可以 生成预备好类型的查询集。或者通过 Engine 更方便的访问 pg 组件。
extractor.go 中提供了提取字段值的逻辑,主要封装了对 JSON 字段的转换
Index ¶
- func ExtractField(val reflect.Value, field reflect.StructField) interface{}
- type DbField
- type DbTable
- func (dbt *DbTable) AllInsertExpr() (exp.Exp, []string)
- func (dbt *DbTable) AllInsertGears() (t *exp.Table, fields []exp.Exp, values []exp.Exp, names []string)
- func (dbt *DbTable) DropTable() string
- func (dbt *DbTable) Extract() (t *exp.Table, pk []exp.Exp, other []exp.Exp, cond exp.Exp)
- func (dbt *DbTable) FetchExpr() (expr exp.Exp, names []string)
- func (dbt *DbTable) GetCreateTableSQL() string
- func (dbt *DbTable) MergeInsertExpr() (exp.Exp, []string)
- func (dbt *DbTable) MergeInsertGears() (t *exp.Table, fields []exp.Exp, values []exp.Exp, returning []exp.Exp, ...)
- func (dbt *DbTable) UpdateExpr(sets []string) (expr exp.Exp, names []string)
- func (dbt *DbTable) UpdateGears(s []string) (t *exp.Table, sets []exp.Exp, cond exp.Exp, names []string)
- type Engine
- func (engine *Engine) AutoTran(fun func(*Engine, *Tran) (interface{}, error)) (interface{}, error)
- func (engine *Engine) Begin() (*Tran, error)
- func (e *Engine) CreateTable(typeName string) error
- func (e *Engine) Delete(obj interface{}) error
- func (e *Engine) DropTable(typeName string) error
- func (e *Engine) Fetch(obj interface{}) error
- func (e *Engine) FinaToCona(typename string, fieldname string) string
- func (e *Engine) Insert(obj interface{}) error
- func (e *Engine) InsertMerge(obj interface{}) error
- func (e *Engine) MapStructTo(s interface{}, tablename string)
- func (e *Engine) PrepareFor(typeName string, exp exp.Exp) (*Query, error)
- func (e *Engine) PrepareSQL(exp exp.Exp) (*sql.Stmt, error)
- func (e *Engine) RegistStruct(s interface{}, tablename string)
- func (engine *Engine) Scalar(expr exp.Exp, args ...interface{}) (interface{}, error)
- func (e *Engine) TynaToTana(typename string) string
- func (e *Engine) Update(obj interface{}) error
- type FieldMap
- type NotFound
- type Parser
- type Query
- type ResultSet
- type Tran
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func ExtractField ¶
func ExtractField(val reflect.Value, field reflect.StructField) interface{}
这个是动态选择的封装接口。除了内置类型的extract,它还提供了对json类型的提取。
Types ¶
type DbField ¶
type DbField struct { GoName string DbName string DbFieldType string IsPK bool DbGen bool NotNull bool Extract func(reflect.Value) (interface{}, func() error) }
DbField 结构用 Go 语言表述一个数据库字段的结构。 stype 指结构字段的类型,这个类型总是指的值类型,如果该字段为指针,就取其 Elem() 判断原始类型是否是指针,看它是不是 NotNull 就可以了。
func NewDbField ¶
func NewDbField(fieldStruct *reflect.StructField) *DbField
NewDbField 是 DbField 的内部构造函数,通常由其它pgears内部类型调用
type DbTable ¶
type DbTable struct { Fields *FieldMap Pk *FieldMap NPk *FieldMap DbGen *FieldMap NDbGen *FieldMap // contains filtered or unexported fields }
DbTable 用 Go 语言描述了数据表的结构
func NewDbTable ¶
NewDbTable 构造一个数据表映射结构
func (*DbTable) AllInsertExpr ¶
AllInsertExpr 方法生成一个用于 Insert 的表达式,包含所有的字段,包括dbgen
func (*DbTable) AllInsertGears ¶
func (dbt *DbTable) AllInsertGears() (t *exp.Table, fields []exp.Exp, values []exp.Exp, names []string)
AllInsertGears 方法生成用于 Insert 的表达式组件,包含所有的字段,包括dbgen
func (*DbTable) MergeInsertExpr ¶
MergeInsertExpr 方法生成一个用于 Insert 的表达式,其中不包括在数据库端自动生成的字段,这些字段包含在 returning 中
func (*DbTable) MergeInsertGears ¶
func (dbt *DbTable) MergeInsertGears() (t *exp.Table, fields []exp.Exp, values []exp.Exp, returning []exp.Exp, names []string)
MergeInsertGears 方法生成用于 Insert 的表达式组件,其中不包括在数据库端自动生成的字段, 这些字段包含在 returning 中
func (*DbTable) UpdateExpr ¶
UpdateExpr 方法生成一个用于 Update 的表达式,这里需要调用者给出准备Update的字段名, 函数生成形如 Update XXX Set ... Where cond 的 SQL 表达式, update 语句中包含主键字段列表,所以虽然它的sets由用户指定,仍然返回参数命名表
type Engine ¶
Engine 类型是管理数据源的业务类型
func CreateEngine ¶
CreateEngine 方法构造一个新的 Engine 对象,error 不为空的话表示构造过程出错。
func (*Engine) CreateTable ¶
增加建表功能 add by zhaonf 2015.12.11 5:16 主要提供脚本进行测试使用
func (*Engine) Delete ¶
Delete 当前的设定是根据pk删除,所以无返回,但是—— TODO:如果返回的受影响数据为0,记一个warning ,发一个error 如果大于1,应该log一个Fail,发一个error,必要的话panic也是可以的……
func (*Engine) Fetch ¶
这里要验证传入的obj的类型是否已经注册,但是应该允许匿名类型,这个接口要另外设计 目前操作匿名类型可以先拼接一个 Exp ,然后让Engine 去 prepare 出对应的 Query, 然后用 Query 和 Result 操作
func (*Engine) FinaToCona ¶
Struct Field Name to Table Column Name
func (*Engine) InsertMerge ¶
insert merge 的设定是insert仅插入非dbgen数据,所有dbgen字段从数据库加载load后的 这个逻辑用于那些主键在数据库层生成的场合,例如自增 id 主键,服务端uuid,时间戳等
func (*Engine) MapStructTo ¶
将类型映射到明确指定的表,遵循一个简单的规则: - tag 可以指定类型,不过一般不用,int/int64 对应 integer, double 对应 float64, text 对应 string。 - 如果 int/int64 的字段,tag 指定了 serial, 就是 serial - time.Time 类型对应到 timestamp,其实其它时间日期类型也可以,pq支持就可以 - tag 包含 PK:"true" 的是主键,可以有复合主键,无关类型 - tag 包含 jsonto:"map" 的 映射到 map[string]interface{} - tag 包含 jsonto:"struct" 的映射到结构,具体的结构类型是一个 reflect.Type, 保存在 DbField 类型的 gotype 字段 - 如果字段定义为值类型,表示对应的是 not null - 如果定义为指针类型,表示对应的是可以为null的字段,读取后的使用应该谨慎 - tag 中的 field:"xxxx" 指定了对应的数据库子段名,这个不能省,一定要写。 没做自动转换真的不是因为懒……相信我……
func (*Engine) PrepareFor ¶
PrepareFor 方法使得 SQL 表达式可以预先 Prepare
func (*Engine) PrepareSQL ¶
PrepareSQL 不做预设的fetch等功夫,如果我们只需要做简单的查询,或者要自己手动静态化, 就可以走这个接口
func (*Engine) RegistStruct ¶
将类型注册到指定的表上,这个操作不要求类型完全匹配表结构,只要部分符合,主键完整即可 适用于部分内容的填充、更新等操作 走这个接口注册类型表示它不是完整的对应数据库中的表。所以可以用表里的数据填充结构,但是 不能反过来依赖其中的结构去推断和维护表 这个接口显然可以将类型注册到不存在的表,这超出了我最初的设计。建议使用这种表名的时候, 起一个跟业务有关的,容易记忆的名字
func (*Engine) Scalar ¶
用于类似 select count(*) from table where cond 这种只需要获取单个结果的查询 程序逻辑直接获取单行的第一列,如果查询实际返回的结果集格式不匹配……大概会出错……吧……
func (*Engine) TynaToTana ¶
Type Name to Table Name 暂时不支持schema NOTE: 需要注意的是当前使用type的Name(),其中包含packages名
type FieldMap ¶
type FieldMap struct {
// contains filtered or unexported fields
}
FieldMap 结构用于管理字段组的双键 map,这样就可以根据结构或表字段名找到对应的字段
type NotFound ¶
type NotFound struct {
// contains filtered or unexported fields
}
func NewNotFound ¶
func NewNotFound(object interface{}) NotFound
type Parser ¶
type Parser struct { *Engine // contains filtered or unexported fields }
Parser 是用于解析参数的独立环境,这样不同语句的 Prepare 可以安全的异步化。将来可 能会通过这个组件实现命名参数。
type ResultSet ¶
Directories ¶
Path | Synopsis |
---|---|
exp 包中是用于 SQL 语句生成的各种组件 exp.go 中保存了 exp 包的一些未分类组件 TODO 普通的表达式没有处理字符串转义,需要接受外部传入的数据的话,请一定参数化 目前还没有对纯文本文法中的命名做映射,要享受转换的能力,请使用 table 和 field 类型 select.go 文件提供以 Sel 类型为核心的 Select 语句生成功能 NOTE Table 的 name 应该是模型的类型名而非表名,表名只在注册模型的时候显式出现 table 和 field 都是指应用层命名,也就是表和字段对应的类型名和字段名 暂时还不支持主子表的嵌套表示,这个应该尽快实现 在 Postgres 中,用双引号包围的命名大小写敏感,可以包含带有空格等特殊符号的字符 这里暂时没有计划支持。
|
exp 包中是用于 SQL 语句生成的各种组件 exp.go 中保存了 exp 包的一些未分类组件 TODO 普通的表达式没有处理字符串转义,需要接受外部传入的数据的话,请一定参数化 目前还没有对纯文本文法中的命名做映射,要享受转换的能力,请使用 table 和 field 类型 select.go 文件提供以 Sel 类型为核心的 Select 语句生成功能 NOTE Table 的 name 应该是模型的类型名而非表名,表名只在注册模型的时候显式出现 table 和 field 都是指应用层命名,也就是表和字段对应的类型名和字段名 暂时还不支持主子表的嵌套表示,这个应该尽快实现 在 Postgres 中,用双引号包围的命名大小写敏感,可以包含带有空格等特殊符号的字符 这里暂时没有计划支持。 |