sq

package module
v0.0.0-...-9eb359e Latest Latest
Warning

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

Go to latest
Published: Oct 12, 2023 License: Apache-2.0 Imports: 24 Imported by: 13

README


goclub/sql

Go Reference

goclub/sql 让你了解每一个函数执行的sql是什么,保证SQL的性能最大化的同时超越ORM的便捷。

指南

在 Go 中与 sql 交互一般会使用 sqlxgorm xorm

sqlx 偏底层,是对 database/sql 的封装,主要提供了基于结构体标签 db:"name""将查询结果解析为结构体的功能。而GORM XORM 功能则更丰富。

直接使用 sqlx 频繁的手写 sql 非常繁琐且容易出错。(database/sql 的接口设计的不是很友好)。

GORM XORM 存在 ORM 都有的特点,使用者容易使用 ORM 运行一些性能不高的 SQL。虽然合理使用也可以写出高效SQL,但使用者在使用 ORM 的时候容易忽略最终运行的SQL是什么。

goclub/sql 提供介于手写 sql 和 ORM 之间的使用体验。

Open

连接数据库

goclub/sql 与 database/sql 连接方式相同,只是多返回了 dbClose 函数。 dbClose 等同于 db.Close

Open

ExecMigrate

通过迁移代码创建表结构

创建用户迁移文件

ExecMigrate

定义Model

通过表单创建 Model: goclub.run

Insert

使用 Insert 插入数据

Insert

InsertModel

基于 Model 插入数据

大部分场景下使用 db.Insert 插入数据有点繁琐。基于 sq.Model 使用 db.InsertModel操作数据会方便很多。

InsertModel

Update

使用 Update 更新数据

Update

goclub/sql 故意没有提供 UpdateModel 方法, 因为使用 UpdateModel 性能并不好,会修改一下原本不需要修改的数据. 使用 db.Update(ctx, sq.QB{...}) 可以"精准"的更新数据

Query

使用 Query 查询单条数据 使用 QuerySlice 查询多条数据

Query

goclub/sql 特意没有提供 QueryModel 方法, 使用 db.Query(ctx, &user, sq.QB{ Where: sq.And(col.ID, sq.Equal(userID)) }) 可以查询 Model

SoftDelete HardDelete

使用SoftDelete 或者 HardDelete 删除数据

delete

Relation

relation

Debug

sq.QB{
	Debug: true
}

打开Debug可以查看

  1. 运行的SQL
  2. explain
  3. 执行时间
  4. last_query_cost

你也可以单独打开某一项或几项

sq.QB{
    PrintSQL: true,
}

sq.QB{
    Explain: true,
}

sq.QB{
    RunTime: true,
}

sq.QB{
    LastQueryCost: true,
}

Review

Review 的作用是用于审查 sql 或增加代码可读性

语法: {#IN#}

默认会直接与执行SQL进行比对, 执行SQL与Review不一致则会在运行时 print 错误.

有时候执行的SQL不是固定的字符串例如

where in 时会根据查询条件不同导致有多种情况

select * from user where id in (?)
select * from user where id in (?,?)
select * from user where id in (?,?,?)
...

虽然可以使用 Reviews 配置多个review

sq.QB{
    Review: []string{
    	"select * from user where id in (?)",
    	"select * from user where id in (?,?)",
		"select * from user where id in (?,?,?),
    },
}

但这样无法覆盖全部的情况.

可以使用 {#IN#} 模糊匹配

sq.QB{
    Review: "select * from user where id in {#IN#}"
}

零次一次

语法

{{#任意字符#}}

如果你使用了 sq.IF 你可能需要用到 Reviews

sq.QB{
    From: &User{},
    Select: []sq.Column{"id"},
    Where: sq.And("name", sq.IF(searchName != "", sq.Equal(searchName))),
    Reviews: []string{
        "SELECT `id` FROM `user` WHERE `name` = ? AND `deleted_at` IS NULL",
        "SELECT `id` FROM `user` WHERE `deleted_at` IS NULL",
    },
}

你可以使用 {{# and name = ?#}} 代替多个 review 建议将空格前置:使用 {{# and name = ?#}}, 而不是 {{#and name = ? #}}`


sq.QB{
    From: &User{},
    Select: []sq.Column{"id"},
    Where: sq.And("name", sq.IF(searchName != "", sq.Equal(searchName))),
    Review: "SELECT `id` FROM `user` WHERE{{# and name = ?#}} AND `deleted_at` IS NULL",
    },
}

语法: {#VALUES#}

一些 Insert 语句会出现 (?,?) (?,?),(?,?) 的情况

INSERT INTO `user` (`name`,`age`) VALUES (?,?),(?,?)
INSERT INTO `user` (`name`,`age`) VALUES (?,?)

可以使用 {#VALUES#} 模糊匹配

sq.QB{
    Review: "INSERT INTO `user` (`name`,`age`) VALUES {#VALUES#}"
}

致谢

感谢 jetbrains 提供 Goland 开源授权

Documentation

Index

Constants

View Source
const (
	// 默认降序
	ASC orderByType = iota
	DESC
)

Variables

Functions

func And

func And(column Column, operator OP) conditions

func AndRaw

func AndRaw(query string, values ...interface{}) conditions

func CheckRowScanErr

func CheckRowScanErr(scanErr error) (has bool, err error)

func ExecMigrate

func ExecMigrate(db *Database, ptr interface{}) (err error)

func NanoID24

func NanoID24() string

NanoID24 `A-Za-z0-9` 24 某些第三方接口需要外部订单号是大小写字母加数字,所以用`A-Za-z0-9` 24 比 默认的21更稳妥.

func OnlyUseInTestToUpdates

func OnlyUseInTestToUpdates(t *testing.T, list []Update) updates

func OrGroup

func OrGroup(conditions ...Condition) conditions

func PlaceholderSlice

func PlaceholderSlice(slice interface{}) (placeholder string)

func RowsAffected

func RowsAffected(result Result, execErr error) (affected int64, err error)

func Set

func Set(column Column, value interface{}) updates

func SetMap

func SetMap(data map[Column]interface{}) updates

func SetRaw

func SetRaw(query string, value ...interface{}) updates

func ToConditions

func ToConditions(c []Condition) conditions

func UUID

func UUID() string

func UUID32

func UUID32() string

Types

type API

type API interface {
	// Ping 检查连通性
	Ping(ctx context.Context) error
	// Close 关闭数据库连接
	Close() error

	// Insert 插入数据
	Insert(ctx context.Context, qb QB) (result Result, err error)
	// InsertAffected 插入数据(返回影响行数)
	InsertAffected(ctx context.Context, qb QB) (affected int64, err error)
	// InsertModel 基于 Model 创建数据, 根据 Model 字段自动填充 qb.Insert
	InsertModel(ctx context.Context, ptr Model, qb QB) (err error)
	// InsertModelAffected 基于 Model 创建数据 (返回影响行数)
	InsertModelAffected(ctx context.Context, ptr Model, qb QB) (affected int64, err error)
	// QueryRow 查询单行多列 类似 sql.Row{}.Scan()
	QueryRow(ctx context.Context, qb QB, desc []interface{}) (has bool, err error)
	// Query 查询单行多列并转换为结构体
	Query(ctx context.Context, ptr Tabler, qb QB) (has bool, err error)
	// QuerySlice 查询多行并转换为结构体
	QuerySlice(ctx context.Context, slicePtr interface{}, qb QB) (err error)
	// QuerySliceScaner 查询多行多列(自定义扫描)
	QuerySliceScaner(ctx context.Context, qb QB, scaner Scaner) (err error)

	QueryRelation(ctx context.Context, ptr Relation, qb QB) (has bool, err error)
	// QueryRelationSlice 查询多条数据并转换为 Relation slice
	QueryRelationSlice(ctx context.Context, relationSlicePtr interface{}, qb QB) (err error)
	// Count SELECT count(*)
	Count(ctx context.Context, from Tabler, qb QB) (count uint64, err error)
	// Has 查询数据是否存在(单条数据是否存在不建议使用 count 而是使用 Exist)
	Has(ctx context.Context, from Tabler, qb QB) (has bool, err error)
	SumInt64(ctx context.Context, from Tabler, column Column, qb QB) (value sql.NullInt64, err error)
	SumFloat64(ctx context.Context, from Tabler, column Column, qb QB) (value sql.NullFloat64, err error)

	// Update 更新
	Update(ctx context.Context, from Tabler, qb QB) (err error)
	// UpdateAffected 更新(返回影响行数)
	UpdateAffected(ctx context.Context, from Tabler, qb QB) (affected int64, err error)
	// ClearTestData 删除测试数据库的数据,只能运行在 test_ 为前缀的数据库中
	ClearTestData(ctx context.Context, form Tabler, qb QB) (err error)

	// HardDelete 硬删除(不可恢复)
	HardDelete(ctx context.Context, form Tabler, qb QB) (err error)
	// HardDeleteAffected 硬删除(不可恢复)(返回影响行数)
	HardDeleteAffected(ctx context.Context, form Tabler, qb QB) (affected int64, err error)
	// SoftDelete 软删除(可恢复)
	SoftDelete(ctx context.Context, form Tabler, qb QB) (err error)
	// SoftDeleteAffected 软删除(可恢复)(返回影响行数)
	SoftDeleteAffected(ctx context.Context, form Tabler, qb QB) (affected int64, err error)

	// ExecQB 执行QB
	ExecQB(ctx context.Context, qb QB, statement Statement) (result Result, err error)
	// ExecQBAffected 执行QB(返回影响行数)
	ExecQBAffected(ctx context.Context, qb QB, statement Statement) (affected int64, err error)
	// Exec 执行
	Exec(ctx context.Context, query string, values []interface{}) (result Result, err error)

	// Begin 开启事务
	Begin(ctx context.Context, level sql.IsolationLevel, handle func(tx *T) TxResult) (rollbackNoError bool, err error)
	BeginOpt(ctx context.Context, opt sql.TxOptions, handle func(tx *T) TxResult) (rollbackNoError bool, err error)
	// LastQueryCost show status like "last_query_cost"
	LastQueryCost(ctx context.Context) (lastQueryCost float64, err error)
	// PrintLastQueryCost 打印 show status like "last_query_cost" 的结果
	PrintLastQueryCost(ctx context.Context)
	// PublishMessage 发布消息
	PublishMessage(ctx context.Context, queueName string, publish Publish) (message Message, err error)
	// ConsumeMessage 消费消息
	ConsumeMessage(ctx context.Context, consume Consume) error
}

type BytesIDLister

type BytesIDLister interface {
	Append(data []byte)
}

type Column

type Column string

func TagToColumns

func TagToColumns(v interface{}) (columns []Column)

func (Column) String

func (c Column) String() string

type Condition

type Condition struct {
	Column Column
	OP     OP
}

func ConditionRaw

func ConditionRaw(query string, values []interface{}) Condition

type Consume

type Consume struct {
	QueueName       string
	HandleError     func(err error)
	HandleMessage   func(message Message) MessageResult
	NextConsumeTime func(consumeChance uint16, maxConsumeChance uint16) time.Duration
	// contains filtered or unexported fields
}

type CreateTimeUpdateTime

type CreateTimeUpdateTime struct {
	CreateTime time.Time `db:"create_time"`
	UpdateTime time.Time `db:"update_time"`
}

type CreatedAtUpdatedAt

type CreatedAtUpdatedAt struct {
	CreatedAt time.Time `db:"created_at"`
	UpdatedAt time.Time `db:"updated_at"`
}

type Database

type Database struct {
	Core              *sqlx.DB
	SQLChecker        SQLChecker
	QueueTimeLocation *time.Location
}

func Open

func Open(driverName string, dataSourceName string) (db *Database, dbClose func() error, err error)

func (*Database) Begin

func (db *Database) Begin(ctx context.Context, level sql.IsolationLevel, handle func(tx *T) TxResult) (rollbackNoError bool, err error)

func (*Database) BeginOpt

func (db *Database) BeginOpt(ctx context.Context, opt sql.TxOptions, handle func(tx *T) TxResult) (rollbackNoError bool, err error)

func (*Database) ClearTestData

func (db *Database) ClearTestData(ctx context.Context, from Tabler, qb QB) (err error)

func (*Database) Close

func (db *Database) Close() error

func (*Database) ConsumeMessage

func (db *Database) ConsumeMessage(ctx context.Context, consume Consume) error

func (*Database) Count

func (db *Database) Count(ctx context.Context, from Tabler, qb QB) (count uint64, err error)

func (*Database) Exec

func (db *Database) Exec(ctx context.Context, query string, values []interface{}) (result Result, err error)

func (*Database) ExecQB

func (db *Database) ExecQB(ctx context.Context, qb QB, statement Statement) (result Result, err error)

func (*Database) ExecQBAffected

func (db *Database) ExecQBAffected(ctx context.Context, qb QB, statement Statement) (affected int64, err error)

func (*Database) HardDelete

func (db *Database) HardDelete(ctx context.Context, from Tabler, qb QB) (err error)

func (*Database) HardDeleteAffected

func (db *Database) HardDeleteAffected(ctx context.Context, from Tabler, qb QB) (affected int64, err error)

func (*Database) Has

func (db *Database) Has(ctx context.Context, from Tabler, qb QB) (has bool, err error)

if you need query data exited SELECT "has" FROM user WHERE id = ? better than SELECT count(*) FROM user where id = ?

func (*Database) InitQueue

func (db *Database) InitQueue(ctx context.Context, queueName string) (err error)

func (*Database) Insert

func (db *Database) Insert(ctx context.Context, qb QB) (result Result, err error)

func (*Database) InsertAffected

func (db *Database) InsertAffected(ctx context.Context, qb QB) (affected int64, err error)

func (*Database) InsertModel

func (db *Database) InsertModel(ctx context.Context, ptr Model, qb QB) (err error)

func (*Database) InsertModelAffected

func (db *Database) InsertModelAffected(ctx context.Context, ptr Model, qb QB) (affected int64, err error)

func (*Database) LastQueryCost

func (db *Database) LastQueryCost(ctx context.Context) (lastQueryCost float64, err error)

func (*Database) Ping

func (db *Database) Ping(ctx context.Context) error

func (*Database) PrintLastQueryCost

func (db *Database) PrintLastQueryCost(ctx context.Context)

func (*Database) PublishMessage

func (db *Database) PublishMessage(ctx context.Context, queueName string, publish Publish) (message Message, err error)

func (*Database) Query

func (db *Database) Query(ctx context.Context, ptr Tabler, qb QB) (has bool, err error)

func (*Database) QueryRelation

func (db *Database) QueryRelation(ctx context.Context, ptr Relation, qb QB) (has bool, err error)

func (*Database) QueryRelationSlice

func (db *Database) QueryRelationSlice(ctx context.Context, relationSlicePtr interface{}, qb QB) (err error)

func (*Database) QueryRow

func (db *Database) QueryRow(ctx context.Context, qb QB, desc []interface{}) (has bool, err error)

func (*Database) QuerySlice

func (db *Database) QuerySlice(ctx context.Context, slicePtr interface{}, qb QB) (err error)

func (*Database) QuerySliceScaner

func (db *Database) QuerySliceScaner(ctx context.Context, qb QB, scan Scaner) (err error)

func (*Database) SoftDelete

func (db *Database) SoftDelete(ctx context.Context, from Tabler, qb QB) (err error)
func (db *Database) hardDeleteModel(ctx context.Context, ptr Model, qb QB) (result Result, err error){
	return coreHardDeleteModel(ctx,db, ptr, qb)
}
func (tx *T) HardDeleteModel(ctx context.Context, ptr Model, qb QB) (result Result, err error){
	return coreHardDeleteModel(ctx, tx, ptr, qb)
}
func coreHardDeleteModel(ctx context.Context, storager Storager, ptr Model, qb QB) (result Result, err error) {
	defer func() { if err != nil { err = xerr.WithStack(err) } }()
	rValue := reflect.ValueOf(ptr)
	rType := rValue.Type()
	if rType.Kind() != reflect.Ptr {
		return result, xerr.New("UpdateModel(ctx, ptr) " + rType.String() + " must be ptr")
	}
	primaryKey, err := safeGetPrimaryKey(ptr); if err != nil {
		return
	}
	qb.From = ptr
	qb.Where = primaryKey
	qb.Limit = 1

	qb.SQLChecker = storager.getSQLChecker()
	raw := qb.SQLDelete()
	qb.execDebugBefore(ctx, storager, StatementUpdate)
	defer qb.execDebugAfter(ctx, storager, StatementUpdate)
	return storager.getCore().ExecContext(ctx, raw.Query, raw.Values...)
}

func (*Database) SoftDeleteAffected

func (db *Database) SoftDeleteAffected(ctx context.Context, from Tabler, qb QB) (affected int64, err error)

func (*Database) SumFloat64

func (db *Database) SumFloat64(ctx context.Context, from Tabler, column Column, qb QB) (value sql.NullFloat64, err error)

func (*Database) SumInt64

func (db *Database) SumInt64(ctx context.Context, from Tabler, column Column, qb QB) (value sql.NullInt64, err error)

func (*Database) Update

func (db *Database) Update(ctx context.Context, from Tabler, qb QB) (err error)

func (*Database) UpdateAffected

func (db *Database) UpdateAffected(ctx context.Context, from Tabler, qb QB) (affected int64, err error)

type DeadLetterHandler

type DeadLetterHandler interface {

	// HandleDeadLetter 将死信消息标记为已处理。
	HandleDeadLetter(ctx context.Context, id uint64, remark string) (err error)
	// RequeueDeadLetter 将死信消息重新入队以重新处理。
	RequeueDeadLetter(ctx context.Context, id uint64, publish Publish) (err error)
	// ArchiveHandledDeadLetter 将已处理过的死信消息归档以备将来分析
	ArchiveHandledDeadLetter(ctx context.Context, ago time.Duration) (cleanCount bool, err error)
}

type DeadLetterQueueMessage

type DeadLetterQueueMessage struct {
	QueueName     string
	ID            uint64    `db:"id" sq:"ignoreInsert"`
	BusinessID    uint64    `db:"business_id"`
	Reason        string    `db:"reason"`
	Handled       bool      `db:"handled"`
	HandledResult string    `db:"handled_result"`
	CreateTime    time.Time `db:"create_time"`
	DefaultLifeCycle
	WithoutSoftDelete
}

func (*DeadLetterQueueMessage) AfterInsert

func (v *DeadLetterQueueMessage) AfterInsert(result Result) error

func (*DeadLetterQueueMessage) TableName

func (q *DeadLetterQueueMessage) TableName() string

type DefaultLifeCycle

type DefaultLifeCycle struct {
}

func (*DefaultLifeCycle) AfterInsert

func (v *DefaultLifeCycle) AfterInsert(result Result) error

func (*DefaultLifeCycle) AfterUpdate

func (v *DefaultLifeCycle) AfterUpdate() error

func (*DefaultLifeCycle) BeforeInsert

func (v *DefaultLifeCycle) BeforeInsert() error

func (*DefaultLifeCycle) BeforeUpdate

func (v *DefaultLifeCycle) BeforeUpdate() error

type DefaultLog

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

func (DefaultLog) DPanic

func (z DefaultLog) DPanic(message string, keysAndValues ...interface{})

func (DefaultLog) Debug

func (z DefaultLog) Debug(message string, keysAndValues ...interface{})

func (DefaultLog) Error

func (z DefaultLog) Error(message string, keysAndValues ...interface{})

func (DefaultLog) Fatal

func (z DefaultLog) Fatal(message string, keysAndValues ...interface{})

func (DefaultLog) Info

func (z DefaultLog) Info(message string, keysAndValues ...interface{})

func (DefaultLog) Panic

func (z DefaultLog) Panic(message string, keysAndValues ...interface{})

func (DefaultLog) Sync

func (z DefaultLog) Sync() error

func (DefaultLog) Warn

func (z DefaultLog) Warn(message string, keysAndValues ...interface{})

type DefaultSQLChecker

type DefaultSQLChecker struct {
}

func (DefaultSQLChecker) Check

func (check DefaultSQLChecker) Check(reviews []string, query string) (pass bool, refs string, err error)

func (DefaultSQLChecker) TrackFail

func (check DefaultSQLChecker) TrackFail(debugID uint64, err error, reviews []string, query string, refs string)

type FromRaw

type FromRaw struct {
	TableName       Raw
	SoftDeleteWhere Raw
}

type GMTCreateGMTModified

type GMTCreateGMTModified struct {
	GMTCreate   time.Time `db:"gmt_create"`
	GMTModified time.Time `db:"gmt_modified"`
}

type Insert

type Insert struct {
	Column Column
	Value  interface{}
}

type InsertMultiple

type InsertMultiple struct {
	Column []Column
	Values [][]interface{}
}

type IntLister

type IntLister interface {
	Append(i int)
}

type Join

type Join struct {
	Type      JoinType
	TableName string
	On        string
}

type JoinType

type JoinType string
const CrossJoin JoinType = "CROSS JOIN"
const FullOuterJoin JoinType = "FULL OUTER JOIN"
const InnerJoin JoinType = "INNER JOIN"
const LeftJoin JoinType = "LEFT JOIN"
const RightJoin JoinType = "RIGHT JOIN"

func (JoinType) String

func (t JoinType) String() string

type Logger

type Logger interface {
	Debug(message string, keysAndValues ...interface{})
	Info(message string, keysAndValues ...interface{})
	Warn(message string, keysAndValues ...interface{})
	Error(message string, keysAndValues ...interface{})
	Sync() error
}

func NewZapLogger

func NewZapLogger() Logger

type Message

type Message struct {
	QueueName        string
	ID               uint64    `db:"id" sq:"ignoreInsert"`
	BusinessID       uint64    `db:"business_id"`
	NextConsumeTime  time.Time `db:"next_consume_time"`
	ConsumeChance    uint16    `db:"consume_chance"`
	MaxConsumeChance uint16    `db:"max_consume_chance"`
	UpdateID         string    `db:"update_id"`
	Priority         uint8     `db:"priority"`
	CreateTime       time.Time `db:"create_time"`

	DefaultLifeCycle
	WithoutSoftDelete
	// contains filtered or unexported fields
}

func (Message) Ack

func (Message) Ack() MessageResult

func (*Message) AfterInsert

func (v *Message) AfterInsert(result Result) error

func (Message) DeadLetter

func (Message) DeadLetter(reason string, err error) MessageResult

func (Message) Requeue

func (Message) Requeue(err error) MessageResult

func (Message) RequeueDelay

func (Message) RequeueDelay(duration time.Duration, err error) MessageResult

func (*Message) TableName

func (message *Message) TableName() string

type MessageResult

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

func (MessageResult) WithError

func (v MessageResult) WithError(err error) MessageResult

type Model

type Model interface {
	Tabler
	BeforeInsert() error
	AfterInsert(result Result) error
	BeforeUpdate() error
	AfterUpdate() error
}

type MysqlDataSource

type MysqlDataSource struct {
	User     string `yaml:"user"`
	Password string `yaml:"password"`
	Host     string `yaml:"host"`
	Port     string `yaml:"port"`
	DB       string `yaml:"db"`
	// DefaultQuery
	// 	map[string]string{
	// 	"charset": "utf8",
	// 	"parseTime": "True",
	// 	"loc": "Local",
	// }
	Query map[string]string `yaml:"query"`
}

func (MysqlDataSource) FormatDSN

func (config MysqlDataSource) FormatDSN() (dataSourceName string)

type OP

type OP struct {
	Query       string
	Values      []interface{}
	Symbol      string
	Placeholder string
	Multiple    []OP
	OrGroup     []Condition
	Ignore      bool
}

func Between

func Between(begin interface{}, end interface{}) OP

func Equal

func Equal(v interface{}) OP

func GT

func GT(v interface{}) OP

func GTE

func GTE(v interface{}) OP

func IF

func IF(condition bool, op OP) OP

func In

func In(slice interface{}) OP

func IsNull

func IsNull() OP

func LT

func LT(v interface{}) OP

func LTE

func LTE(v interface{}) OP

func Like

func Like(s string) OP

func LikeLeft

func LikeLeft(s string) OP

func LikeRight

func LikeRight(s string) OP

func Multiple

func Multiple(ops []OP) OP

func NotBetween

func NotBetween(begin interface{}, end interface{}) OP

func NotEqual

func NotEqual(v interface{}) OP

func SubQuery

func SubQuery(symbol string, qb QB) OP

type OrderBy

type OrderBy struct {
	Column Column
	Type   orderByType
}

type Publish

type Publish struct {
	BusinessID       uint64
	NextConsumeTime  time.Duration
	MaxConsumeChance uint16
	Priority         uint8 `default:"100"`
}

type QB

type QB struct {
	Select    []Column
	SelectRaw []Raw

	From Tabler

	FromRaw FromRaw

	DisableSoftDelete bool

	UnionTable UnionTable

	Index string

	Set []Update
	// UPDATE IGNORE
	UseUpdateIgnore bool
	Insert          Values
	InsertMultiple  InsertMultiple
	// INSERT IGNORE INTO
	UseInsertIgnoreInto bool

	Where           []Condition
	WhereOR         [][]Condition
	WhereRaw        Raw
	WhereAllowEmpty bool

	OrderBy    []OrderBy
	OrderByRaw Raw

	GroupBy    []Column
	GroupByRaw Raw

	Having    []Condition
	HavingRaw Raw

	Limit uint64

	Offset uint64

	Lock SelectLock

	Join []Join
	Raw  Raw

	Debug bool

	PrintSQL bool
	Explain  bool
	RunTime  bool

	LastQueryCost bool

	Review     string
	Reviews    []string
	SQLChecker SQLChecker
	// contains filtered or unexported fields
}

func (QB) Paging

func (qb QB) Paging(page uint64, perPage uint32) QB

func (QB) SQL

func (qb QB) SQL(statement Statement) Raw

func (QB) SQLDelete

func (qb QB) SQLDelete() Raw

func (QB) SQLInsert

func (qb QB) SQLInsert() Raw

func (QB) SQLSelect

func (qb QB) SQLSelect() Raw

func (QB) SQLUpdate

func (qb QB) SQLUpdate() Raw

type Raw

type Raw struct {
	Query  string
	Values []interface{}
}

func ConditionsSQL

func ConditionsSQL(w [][]Condition) (raw Raw)
func (w conditions) OrGroup(conditions []Condition) conditions {
	op := OP{OrGroup: conditions}
	item := Condition{OP:op}
	w = append(w, item)
	return w
}

func (Raw) IsZero

func (r Raw) IsZero() bool

type Relation

type Relation interface {
	TableName() string
	SoftDeleteWhere() Raw
	RelationJoin() []Join
}

type Result

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

func (Result) LastInsertId

func (r Result) LastInsertId() (id int64, err error)

func (Result) LastInsertUint64Id

func (r Result) LastInsertUint64Id() (id uint64, err error)

func (Result) RowsAffected

func (r Result) RowsAffected() (rowsAffected int64, err error)

type SQLChecker

type SQLChecker interface {
	Check(checkSQL []string, execSQL string) (pass bool, refs string, err error)
	TrackFail(debugID uint64, err error, reviews []string, query string, refs string)
}

type Scaner

type Scaner func(rows *sqlx.Rows) error

func ScanBool

func ScanBool(bools *[]bool) Scaner

func ScanBytes

func ScanBytes(bytes *[][]byte) Scaner

func ScanBytesLister

func ScanBytesLister(list BytesIDLister) Scaner

func ScanInt64s

func ScanInt64s(ints *[]int64) Scaner

func ScanIntLister

func ScanIntLister(list IntLister) Scaner

func ScanInts

func ScanInts(ints *[]int) Scaner

func ScanStringLister

func ScanStringLister(list StringLister) Scaner

func ScanStrings

func ScanStrings(strings *[]string) Scaner

func ScanTimes

func ScanTimes(times *[]time.Time) Scaner

func ScanUint64s

func ScanUint64s(ints *[]uint64) Scaner

func ScanUintLister

func ScanUintLister(list UintLister) Scaner

func ScanUints

func ScanUints(ints *[]uint) Scaner

type SelectLock

type SelectLock string
const FORSHARE SelectLock = "FOR SHARE"
const FORUPDATE SelectLock = "FOR UPDATE"

func (SelectLock) String

func (s SelectLock) String() string

type SoftDeleteTime

type SoftDeleteTime struct{}

func (SoftDeleteTime) SoftDeleteSet

func (SoftDeleteTime) SoftDeleteSet() Raw

func (SoftDeleteTime) SoftDeleteWhere

func (SoftDeleteTime) SoftDeleteWhere() Raw

type SoftDeletedAt

type SoftDeletedAt struct{}

func (SoftDeletedAt) SoftDeleteSet

func (SoftDeletedAt) SoftDeleteSet() Raw

func (SoftDeletedAt) SoftDeleteWhere

func (SoftDeletedAt) SoftDeleteWhere() Raw

type SoftIsDeleted

type SoftIsDeleted struct{}

func (SoftIsDeleted) SoftDeleteSet

func (SoftIsDeleted) SoftDeleteSet() Raw

func (SoftIsDeleted) SoftDeleteWhere

func (SoftIsDeleted) SoftDeleteWhere() Raw

type Statement

type Statement string
const StatementDelete Statement = "DELETE"
const StatementInsert Statement = "INSERT"
const StatementSelect Statement = "SELECT"
const StatementUpdate Statement = "UPDATE"

func (Statement) String

func (s Statement) String() string

type Storager

type Storager interface {
	// contains filtered or unexported methods
}

type StoragerCore

type StoragerCore interface {
	sqlx.Queryer
	sqlx.QueryerContext
	sqlx.Execer
	sqlx.ExecerContext
	sqlx.Preparer
	sqlx.PreparerContext
	SelectContext(ctx context.Context, dest interface{}, query string, args ...interface{}) error
}

type StringLister

type StringLister interface {
	Append(s string)
}

type T

type T struct {
	Core *sqlx.Tx
	// contains filtered or unexported fields
}

func (T) Commit

func (T) Commit() TxResult

func (*T) Count

func (tx *T) Count(ctx context.Context, from Tabler, qb QB) (count uint64, err error)

func (T) Error

func (T) Error(err error) TxResult

Error same RollbackWithError

func (*T) Exec

func (tx *T) Exec(ctx context.Context, query string, values []interface{}) (result Result, err error)

func (*T) ExecQB

func (tx *T) ExecQB(ctx context.Context, qb QB, statement Statement) (result Result, err error)

func (*T) ExecQBAffected

func (tx *T) ExecQBAffected(ctx context.Context, qb QB, statement Statement) (affected int64, err error)

func (*T) HardDelete

func (tx *T) HardDelete(ctx context.Context, from Tabler, qb QB) (err error)

func (*T) HardDeleteAffected

func (tx *T) HardDeleteAffected(ctx context.Context, from Tabler, qb QB) (affected int64, err error)

func (*T) Has

func (tx *T) Has(ctx context.Context, from Tabler, qb QB) (has bool, err error)

func (*T) Insert

func (tx *T) Insert(ctx context.Context, qb QB) (result Result, err error)

func (*T) InsertAffected

func (tx *T) InsertAffected(ctx context.Context, qb QB) (affected int64, err error)

func (*T) InsertModel

func (tx *T) InsertModel(ctx context.Context, ptr Model, qb QB) (err error)

func (*T) InsertModelAffected

func (tx *T) InsertModelAffected(ctx context.Context, ptr Model, qb QB) (affected int64, err error)

func (*T) LastQueryCost

func (tx *T) LastQueryCost(ctx context.Context) (lastQueryCost float64, err error)

func (*T) PrintLastQueryCost

func (tx *T) PrintLastQueryCost(ctx context.Context)

func (*T) PublishMessage

func (tx *T) PublishMessage(ctx context.Context, queueName string, publish Publish) (message Message, err error)

func (*T) Query

func (tx *T) Query(ctx context.Context, ptr Tabler, qb QB) (has bool, err error)

func (*T) QueryRelation

func (tx *T) QueryRelation(ctx context.Context, ptr Relation, qb QB) (has bool, err error)

func (*T) QueryRelationSlice

func (tx *T) QueryRelationSlice(ctx context.Context, relationSlicePtr interface{}, qb QB) (err error)

func (*T) QueryRow

func (tx *T) QueryRow(ctx context.Context, qb QB, desc []interface{}) (has bool, err error)

func (*T) QuerySlice

func (tx *T) QuerySlice(ctx context.Context, slicePtr interface{}, qb QB) (err error)

func (*T) QuerySliceScaner

func (tx *T) QuerySliceScaner(ctx context.Context, qb QB, scan Scaner) error

func (T) Rollback

func (T) Rollback() TxResult

func (T) RollbackWithError

func (T) RollbackWithError(err error) TxResult

func (*T) SoftDelete

func (tx *T) SoftDelete(ctx context.Context, from Tabler, qb QB) (err error)

func (*T) SoftDeleteAffected

func (tx *T) SoftDeleteAffected(ctx context.Context, from Tabler, qb QB) (affected int64, err error)

func (*T) SumFloat64

func (tx *T) SumFloat64(ctx context.Context, from Tabler, column Column, qb QB) (value sql.NullFloat64, err error)

func (*T) SumInt64

func (tx *T) SumInt64(ctx context.Context, from Tabler, column Column, qb QB) (value sql.NullInt64, err error)

func (*T) Update

func (tx *T) Update(ctx context.Context, from Tabler, qb QB) (err error)

func (*T) UpdateAffected

func (tx *T) UpdateAffected(ctx context.Context, from Tabler, qb QB) (affected int64, err error)

type Tabler

type Tabler interface {
	TableName() string
	SoftDeleteWhere() Raw
	SoftDeleteSet() Raw
}

func Table

func Table(tableName string, softDeleteWhere func() Raw, softDeleteSet func() Raw) Tabler

sq.Table("user",nil, nil) sq.Table("user", sq.Raw{"`deleted_at` IS NULL", nil}, sq.Raw{"`deleted_at` = ?" ,[]interface{}{time.Now()}})

type Tag

type Tag struct {
	Value string
}

func (Tag) IsIgnoreInsert

func (t Tag) IsIgnoreInsert() bool

type TxResult

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

TxResult tx.Commit() commit transaction tx.Rollback() rollback transaction , rollbackNoError = true tx.Error(err) rollback transaction , rollbackNoError = false, err = err

func (TxResult) Error

func (result TxResult) Error() string

给 TxResult 增加 Error 接口是为了避出现类似 tx.Rollback() 前面没有 return 的错误

type UintLister

type UintLister interface {
	Append(i uint)
}

type UnionTable

type UnionTable struct {
	Tables   []QB
	UnionAll bool
}

func (UnionTable) SQLSelect

func (union UnionTable) SQLSelect() (raw Raw)

type Update

type Update struct {
	Column Column
	Value  interface{}
	Raw    Raw
}

sq.Set(column, value)

type Values

type Values []Insert

type WithoutSoftDelete

type WithoutSoftDelete struct{}

func (WithoutSoftDelete) SoftDeleteSet

func (WithoutSoftDelete) SoftDeleteSet() Raw

func (WithoutSoftDelete) SoftDeleteWhere

func (WithoutSoftDelete) SoftDeleteWhere() Raw

Directories

Path Synopsis
example
internal/model
Generate by https://goclub.run
Generate by https://goclub.run
generics module

Jump to

Keyboard shortcuts

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