exp

package
v0.0.0-...-df70bd3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 30, 2016 License: Apache-2.0 Imports: 7 Imported by: 1

Documentation

Overview

exp 包中是用于 SQL 语句生成的各种组件

exp.go 中保存了 exp 包的一些未分类组件

TODO

普通的表达式没有处理字符串转义,需要接受外部传入的数据的话,请一定参数化

目前还没有对纯文本文法中的命名做映射,要享受转换的能力,请使用 table 和 field 类型

select.go 文件提供以 Sel 类型为核心的 Select 语句生成功能

NOTE

Table 的 name 应该是模型的类型名而非表名,表名只在注册模型的时候显式出现

table 和 field 都是指应用层命名,也就是表和字段对应的类型名和字段名 暂时还不支持主子表的嵌套表示,这个应该尽快实现 在 Postgres 中,用双引号包围的命名大小写敏感,可以包含带有空格等特殊符号的字符 这里暂时没有计划支持。这个别名功能主要供应用层编程使用, 暂时看不到复杂的数据库或应用层命名能带来什么好处。 NOTE:Table 的 name 应该是模型的类型名而非表名,表名只在注册模型的时候显式出现

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Arg

func Arg(order int) *arg

我也觉得自动生成序列号比较省力气啊。不过想了半天, $%d 就是为了可以指定参数插入位置啊, 自动生成顺序就白瞎了啊…… 将来可能会把这个变成支持命名的,order虽然更省事儿,但是命名相对来说更省心

func FTS

func FTS(field Exp, query Exp) *fullTextSearch

func FieldIsNull

func FieldIsNull(field Exp) fieldIsNull

func IncOrder

func IncOrder(e Exp, step int)

IncOrder 其实在 pgears 之外应该不太有机会用到,这个是内部生成表达式的时候偶尔 需要调整表达式中参数的 order,这个就是起这种作用的,其实如果全命名化了也就没这个问题了。 之所以公开是因为 Engine 会用到。

func Not

func Not(exp Exp) *not

func Snippet

func Snippet(s string) *snippet

Types

type Del

type Del struct {
	// contains filtered or unexported fields
}

func Delete

func Delete(table *Table) *Del

func (*Del) Eval

func (del *Del) Eval(env Env) string

func (*Del) Where

func (del *Del) Where(where Exp) *Del

type Env

type Env interface {
	// Type Name to Table Name
	// NOTE: 需要注意的是当前使用type的 Name(),其中包含 packages 名
	TynaToTana(typename string) string
	// Struct Field Name to Table Column Name
	FinaToCona(typename string, fieldname string) string
	Scope() Exp
	SetScope(Exp)
}

type Exp

type Exp interface {
	Eval(Env) string
}

func And

func And(x, y Exp) Exp

func As

func As(exp Exp, name string) Exp

func BinOpt

func BinOpt(name string, left, right Exp) Exp

func Brackets

func Brackets(exp Exp) Exp

func Count

func Count(fields ...Exp) Exp

TODO: postgresql 是不是允许count多个字段列啊……

func Counts

func Counts() Exp

count(*)

func Desc

func Desc(field Exp) Exp

Desc 生成一个用于orderby desc的表达式

func Equal

func Equal(x, y Exp) Exp

func Func

func Func(name string, args ...Exp) Exp

func Great

func Great(x, y Exp) Exp

func In

func In(test Exp, set ...Exp) Exp

func Integer

func Integer(data int) Exp

Integer 函数生成 integer 类型表达式,这个 integer 指 PostgreSQL 中的 integer 类型

func IsNullFunc

func IsNullFunc(field Exp, exp Exp) Exp

func Less

func Less(x, y Exp) Exp

func Like

func Like(x, y Exp) Exp

func NotEqual

func NotEqual(x, y Exp) Exp

func NullIf

func NullIf(field Exp, exp Exp) Exp

func Or

func Or(x, y Exp) Exp

func Text

func Text(data string) Exp

Text 函数用于生成text类型的表达式。 text 就是 PostgreSQL 的 text 类型。由于作者太懒,先用这个代替所有的文本和字符串类型用吧, 在 PG 里其实一般的规模好像也问题不大……

func Timestamp

func Timestamp(data time.Time) Exp

Timestamp 函数用于生成 timestamp 类型的表达式。 timestamp 类型即 PostgreSQL 的 timestamp 时间戳。由于作者太懒,目前还没有 Date 和 Datetime 类型的支持。

func X

func X() Exp

type Field

type Field struct {
	Table  *Table
	GoName string
	DbName string
}

func (*Field) Eval

func (f *Field) Eval(env Env) string

type Ins

type Ins struct {
	// contains filtered or unexported fields
}

Insert 结构体的 Returing 操作会返回到结构参数的对效应字段,而 Insert 一组值则会将得到的结果集返回

func Insert

func Insert(table *Table, fields ...Exp) *Ins

func (*Ins) Eval

func (ins *Ins) Eval(env Env) string

func (*Ins) Returning

func (ins *Ins) Returning(fields ...Exp) *Ins

func (*Ins) Values

func (ins *Ins) Values(args ...Exp) *Ins

type Sel

type Sel struct {
	// contains filtered or unexported fields
}

desc 应该能作用到确定的排序字段

func Select

func Select(fields ...Exp) *Sel

func SelectThem

func SelectThem(fields ...string) *Sel

func (Sel) Eval

func (sel Sel) Eval(env Env) string

func (*Sel) From

func (sel *Sel) From(t *Table) *Sel

func (*Sel) GroupBy

func (sel *Sel) GroupBy(fields ...Exp) *Sel

func (*Sel) Having

func (sel *Sel) Having(exp Exp) *Sel

func (*Sel) Join

func (sel *Sel) Join(t *Table, on Exp) *Sel

func (*Sel) LeftJoin

func (sel *Sel) LeftJoin(t *Table, on Exp) *Sel

func (*Sel) Limit

func (sel *Sel) Limit(limit int) *Sel

本来我想把 limit 和 offset 设定成 Exp ,但是想来想去写了这么多SQL从来没有这样的用法咯……

func (*Sel) Offset

func (sel *Sel) Offset(offset int) *Sel

func (*Sel) OrderBy

func (sel *Sel) OrderBy(fields ...Exp) *Sel

func (*Sel) Where

func (sel *Sel) Where(exp Exp) *Sel

type Table

type Table struct {
	GoName    string
	DbName    string
	AliasName string
}

func NewTable

func NewTable(goname string) *Table

这里的goname必须是一个fullname,即 type.PkgPath()+"."+type.Name(), 如 time.Time。 原本想传一个 reflect.Type ,后来我琢磨了一下,在实际调用场景里好像现构造一个 reflect.Type 也不省心……

func TableAs

func TableAs(goname, dbname string) *Table

直接指定类型名和表名。

func TableBy

func TableBy(typ reflect.Type) *Table

就是类似这样,需要多一行代码,先 var typ = reflect.TypeOf(你手头的那个对象) Engine 对象调用已注册对象的curd的时候就需要这个

func (*Table) Alias

func (t *Table) Alias() string

func (*Table) As

func (t *Table) As(alias string) *Table

func (*Table) Eval

func (t *Table) Eval(env Env) string

func (*Table) Field

func (t *Table) Field(f string) *Field

func (*Table) Fields

func (t *Table) Fields(fields string) []Exp

type Upd

type Upd struct {
	// contains filtered or unexported fields
}

func Update

func Update(t *Table) *Upd

func (*Upd) Eval

func (upd *Upd) Eval(env Env) string

func (*Upd) Set

func (upd *Upd) Set(set ...Exp) *Upd

一开始我想用map,但是想起来现在参数是按顺序传递的,如果用字典会有问题 这里用[]*Exp,请务必传入 equal 而不是别的……拜托了……

func (*Upd) Where

func (upd *Upd) Where(exp Exp) *Upd

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL