schema

package
v1.1.15 Latest Latest
Warning

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

Go to latest
Published: Jun 17, 2023 License: BSD-2-Clause Imports: 23 Imported by: 4

Documentation

Index

Constants

View Source
const (
	InvalidRelation = iota
	HasOneRelation
	BelongsToRelation
	HasManyRelation
	ManyToManyRelation
)

Variables

This section is empty.

Functions

func Append

func Append(fmter Formatter, b []byte, v interface{}) []byte

func AppendBoolValue

func AppendBoolValue(fmter Formatter, b []byte, v reflect.Value) []byte

func AppendFloat32Value

func AppendFloat32Value(fmter Formatter, b []byte, v reflect.Value) []byte

func AppendFloat64Value

func AppendFloat64Value(fmter Formatter, b []byte, v reflect.Value) []byte

func AppendIntValue

func AppendIntValue(fmter Formatter, b []byte, v reflect.Value) []byte

func AppendJSONValue

func AppendJSONValue(fmter Formatter, b []byte, v reflect.Value) []byte

func AppendQueryAppender

func AppendQueryAppender(fmter Formatter, b []byte, app QueryAppender) []byte

func AppendStringValue

func AppendStringValue(fmter Formatter, b []byte, v reflect.Value) []byte

func AppendUintValue

func AppendUintValue(fmter Formatter, b []byte, v reflect.Value) []byte

func DiscoverSQLType

func DiscoverSQLType(typ reflect.Type) string

func SetTableNameInflector

func SetTableNameInflector(fn func(string) string)

SetTableNameInflector overrides the default func that pluralizes model name to get table name, e.g. my_article becomes my_articles.

Types

type AfterScanHook

type AfterScanHook interface {
	AfterScan(context.Context) error
}

type AfterScanRowHook

type AfterScanRowHook interface {
	AfterScanRow(context.Context) error
}

type AppenderFunc

type AppenderFunc func(fmter Formatter, b []byte, v reflect.Value) []byte

func Appender

func Appender(dialect Dialect, typ reflect.Type) AppenderFunc

func FieldAppender

func FieldAppender(dialect Dialect, field *Field) AppenderFunc

func PtrAppender

func PtrAppender(fn AppenderFunc) AppenderFunc

type BaseDialect

type BaseDialect struct{}

func (BaseDialect) AppendBool

func (BaseDialect) AppendBool(b []byte, v bool) []byte

func (BaseDialect) AppendBytes

func (BaseDialect) AppendBytes(b, bs []byte) []byte

func (BaseDialect) AppendJSON

func (BaseDialect) AppendJSON(b, jsonb []byte) []byte

func (BaseDialect) AppendString

func (BaseDialect) AppendString(b []byte, s string) []byte

func (BaseDialect) AppendTime

func (BaseDialect) AppendTime(b []byte, tm time.Time) []byte

func (BaseDialect) AppendUint32

func (BaseDialect) AppendUint32(b []byte, n uint32) []byte

func (BaseDialect) AppendUint64

func (BaseDialect) AppendUint64(b []byte, n uint64) []byte

type BaseModel

type BaseModel struct{}

type BeforeAppendModelHook

type BeforeAppendModelHook interface {
	BeforeAppendModel(ctx context.Context, query Query) error
}

type BeforeScanHook

type BeforeScanHook interface {
	BeforeScan(context.Context) error
}

type BeforeScanRowHook

type BeforeScanRowHook interface {
	BeforeScanRow(context.Context) error
}

type ColumnsAppender

type ColumnsAppender interface {
	AppendColumns(fmter Formatter, b []byte) ([]byte, error)
}

type CustomAppender

type CustomAppender func(typ reflect.Type) AppenderFunc

type Dialect

type Dialect interface {
	Init(db *sql.DB)

	Name() dialect.Name
	Features() feature.Feature

	Tables() *Tables
	OnTable(table *Table)

	IdentQuote() byte

	AppendUint32(b []byte, n uint32) []byte
	AppendUint64(b []byte, n uint64) []byte
	AppendTime(b []byte, tm time.Time) []byte
	AppendString(b []byte, s string) []byte
	AppendBytes(b []byte, bs []byte) []byte
	AppendJSON(b, jsonb []byte) []byte
	AppendBool(b []byte, v bool) []byte

	// DefaultVarcharLen should be returned for dialects in which specifying VARCHAR length
	// is mandatory in queries that modify the schema (CREATE TABLE / ADD COLUMN, etc).
	// Dialects that do not have such requirement may return 0, which should be interpreted so by the caller.
	DefaultVarcharLen() int
}

type Field

type Field struct {
	StructField reflect.StructField
	IsPtr       bool

	Tag          tagparser.Tag
	IndirectType reflect.Type
	Index        []int

	Name    string // SQL name, .e.g. id
	SQLName Safe   // escaped SQL name, e.g. "id"
	GoName  string // struct field name, e.g. Id

	DiscoveredSQLType  string
	UserSQLType        string
	CreateTableSQLType string
	SQLDefault         string

	OnDelete string
	OnUpdate string

	IsPK          bool
	NotNull       bool
	NullZero      bool
	AutoIncrement bool
	Identity      bool

	Append AppenderFunc
	Scan   ScannerFunc
	IsZero IsZeroerFunc
}

func (*Field) AppendValue

func (f *Field) AppendValue(fmter Formatter, b []byte, strct reflect.Value) []byte

func (*Field) Clone

func (f *Field) Clone() *Field

func (*Field) HasNilValue

func (f *Field) HasNilValue(v reflect.Value) bool

func (*Field) HasZeroValue

func (f *Field) HasZeroValue(v reflect.Value) bool

func (*Field) ScanValue

func (f *Field) ScanValue(strct reflect.Value, src interface{}) error

func (*Field) ScanWithCheck

func (f *Field) ScanWithCheck(fv reflect.Value, src interface{}) error

func (*Field) SkipUpdate

func (f *Field) SkipUpdate() bool

func (*Field) String

func (f *Field) String() string

func (*Field) Value

func (f *Field) Value(strct reflect.Value) reflect.Value

type Formatter

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

func NewFormatter

func NewFormatter(dialect Dialect) Formatter

func NewNopFormatter

func NewNopFormatter() Formatter

func (Formatter) AppendIdent

func (f Formatter) AppendIdent(b []byte, ident string) []byte

func (Formatter) AppendQuery

func (f Formatter) AppendQuery(dst []byte, query string, args ...interface{}) []byte

func (Formatter) AppendValue

func (f Formatter) AppendValue(b []byte, v reflect.Value) []byte

func (Formatter) Dialect

func (f Formatter) Dialect() Dialect

func (Formatter) FormatQuery

func (f Formatter) FormatQuery(query string, args ...interface{}) string

func (Formatter) HasFeature

func (f Formatter) HasFeature(feature feature.Feature) bool

func (Formatter) IdentQuote

func (f Formatter) IdentQuote() byte

func (Formatter) IsNop

func (f Formatter) IsNop() bool

func (Formatter) WithArg

func (f Formatter) WithArg(arg NamedArgAppender) Formatter

func (Formatter) WithNamedArg

func (f Formatter) WithNamedArg(name string, value interface{}) Formatter

type Ident

type Ident string

Ident represents a SQL identifier, for example, table or column name.

func (Ident) AppendQuery

func (s Ident) AppendQuery(fmter Formatter, b []byte) ([]byte, error)

type IsZeroerFunc

type IsZeroerFunc func(reflect.Value) bool

type Model

type Model interface {
	ScanRows(ctx context.Context, rows *sql.Rows) (int, error)
	Value() interface{}
}

type NamedArgAppender

type NamedArgAppender interface {
	AppendNamedArg(fmter Formatter, b []byte, name string) ([]byte, bool)
}

type NullTime

type NullTime struct {
	time.Time
}

NullTime is a time.Time wrapper that marshals zero time as JSON null and SQL NULL.

func (NullTime) AppendQuery

func (tm NullTime) AppendQuery(fmter Formatter, b []byte) ([]byte, error)

func (NullTime) MarshalJSON

func (tm NullTime) MarshalJSON() ([]byte, error)

func (*NullTime) Scan

func (tm *NullTime) Scan(src interface{}) error

func (*NullTime) UnmarshalJSON

func (tm *NullTime) UnmarshalJSON(b []byte) error

type Query

type Query interface {
	QueryAppender
	Operation() string
	GetModel() Model
	GetTableName() string
}

type QueryAppender

type QueryAppender interface {
	AppendQuery(fmter Formatter, b []byte) ([]byte, error)
}

func In

func In(slice interface{}) QueryAppender

type QueryWithArgs

type QueryWithArgs struct {
	Query string
	Args  []interface{}
}

func SafeQuery

func SafeQuery(query string, args []interface{}) QueryWithArgs

func UnsafeIdent

func UnsafeIdent(ident string) QueryWithArgs

func (QueryWithArgs) AppendQuery

func (q QueryWithArgs) AppendQuery(fmter Formatter, b []byte) ([]byte, error)

func (QueryWithArgs) IsZero

func (q QueryWithArgs) IsZero() bool

type QueryWithSep

type QueryWithSep struct {
	QueryWithArgs
	Sep string
}

func SafeQueryWithSep

func SafeQueryWithSep(query string, args []interface{}, sep string) QueryWithSep

type Relation

type Relation struct {
	Type       int
	Field      *Field
	JoinTable  *Table
	BaseFields []*Field
	JoinFields []*Field
	OnUpdate   string
	OnDelete   string
	Condition  []string

	PolymorphicField *Field
	PolymorphicValue string

	M2MTable      *Table
	M2MBaseFields []*Field
	M2MJoinFields []*Field
}

func (*Relation) String

func (r *Relation) String() string

type Safe

type Safe string

Safe represents a safe SQL query.

func (Safe) AppendQuery

func (s Safe) AppendQuery(fmter Formatter, b []byte) ([]byte, error)

type ScannerFunc

type ScannerFunc func(dest reflect.Value, src interface{}) error

func FieldScanner

func FieldScanner(dialect Dialect, field *Field) ScannerFunc

func PtrScanner

func PtrScanner(fn ScannerFunc) ScannerFunc

func Scanner

func Scanner(typ reflect.Type) ScannerFunc

type Table

type Table struct {
	Type      reflect.Type
	ZeroValue reflect.Value // reflect.Struct
	ZeroIface interface{}   // struct pointer

	TypeName  string
	ModelName string

	Name              string
	SQLName           Safe
	SQLNameForSelects Safe
	Alias             string
	SQLAlias          Safe

	Fields     []*Field // PKs + DataFields
	PKs        []*Field
	DataFields []*Field

	FieldMap map[string]*Field

	Relations map[string]*Relation
	Unique    map[string][]*Field

	SoftDeleteField       *Field
	UpdateSoftDeleteField func(fv reflect.Value, tm time.Time) error
	// contains filtered or unexported fields
}

Table represents a SQL table created from Go struct.

func (*Table) AppendNamedArg

func (t *Table) AppendNamedArg(
	fmter Formatter, b []byte, name string, strct reflect.Value,
) ([]byte, bool)

func (*Table) CheckPKs

func (t *Table) CheckPKs() error

func (*Table) Dialect

func (t *Table) Dialect() Dialect

func (*Table) Field

func (t *Table) Field(name string) (*Field, error)

func (*Table) HasAfterScanHook

func (t *Table) HasAfterScanHook() bool

DEPRECATED. Use HasAfterScanRowHook.

func (*Table) HasAfterScanRowHook

func (t *Table) HasAfterScanRowHook() bool

func (*Table) HasBeforeAppendModelHook

func (t *Table) HasBeforeAppendModelHook() bool

func (*Table) HasBeforeScanHook

func (t *Table) HasBeforeScanHook() bool

DEPRECATED. Use HasBeforeScanRowHook.

func (*Table) HasBeforeScanRowHook

func (t *Table) HasBeforeScanRowHook() bool

func (*Table) HasField

func (t *Table) HasField(name string) bool

func (*Table) String

func (t *Table) String() string

type Tables

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

func NewTables

func NewTables(dialect Dialect) *Tables

func (*Tables) ByModel

func (t *Tables) ByModel(name string) *Table

func (*Tables) ByName

func (t *Tables) ByName(name string) *Table

func (*Tables) Get

func (t *Tables) Get(typ reflect.Type) *Table

func (*Tables) Ref

func (t *Tables) Ref(typ reflect.Type) *Table

func (*Tables) Register

func (t *Tables) Register(models ...interface{})

Jump to

Keyboard shortcuts

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