sql

package module
v0.9.9 Latest Latest
Warning

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

Go to latest
Published: Jan 20, 2022 License: Apache-2.0 Imports: 17 Imported by: 10

README

SQL

基于 fns.Service 实现的内部 SQL 服务,讲 sql 操作服务化,同时支持分布式事务。

安装

go get github.com/aacfactory/fns-contrib/databases/sql

使用

配置文件
  • 单机
    • masterSlaverMode = false,dsn 列表为一个元素。
  • 主从
    • masterSlaverMode = true,dsn 列表第一个元素为主服务地址,后续为从服务地址。
  • 集群
    • masterSlaverMode = false,dsn 列表多元素。
{
  "sql": {
    "masterSlaverMode": false,
    "driver": "",
    "dsn": [
      "username:password@tcp(ip:port)/databases" // 也可以是 sql.Open() 中的参数值
    ],
    "maxIdles": 0,
    "maxOpens": 0
  }
}
导入驱动

fns.sql 本身不带驱动,需要导入与配置文件中相同的驱动。

import _ "github.com/go-sql-driver/mysql"
服务部署
  • fns为单机模式
    • 直接部署
  • fns为分布式模式
    • 可以单独起一个(一组)只有 sql 服务的应用(推荐)。
    • 也可以与fns单机模式一样使用。
    • 支持分布式事务。
app.Deply(sql.Service())
// 手动标注方言,自动是以实际使用的driver进行标注。
app.RegisterDialect("postgres")
代理使用

具体参考 proxy.go

// 在上下文中开启事务
sql.BeginTransaction(ctx)
// 提交上下文中的事务
sql.CommitTransaction(ctx)
// 查询,如果 param 中设置在事务中查询,则使用事务查询
sql.Query(ctx, param)
// 执行,如果 param 中设置在事务中查询,则使用事务查询
sql.Execute(ctx, param)

分布式事务(GlobalTransactionManagement)

使用以请求编号绑定事务,并在请求上下文中标记事务所在服务,在服务发现的精确发现功能中把同一个请求上下文(无论在哪个节点)都转发到事务所在服务。
注意事项:

  • 事务开启时需求一个 timeout,默认是10秒,当在这个时间内没有被提交或回滚,超时后会自动回滚。
  • 使用分布式事务的最佳方式是采样 proxy 中的函数,而非其它自行代理操作。
  • 部署的方式最好是以单独服务的方式(一个fns内只有 sql 服务)部署一个集群。

Documentation

Index

Constants

View Source
const (
	StringType  = ColumnType("string")
	IntType     = ColumnType("int")
	FloatType   = ColumnType("float")
	BytesType   = ColumnType("bytes")
	JsonType    = ColumnType("json")
	BoolType    = ColumnType("bool")
	TimeType    = ColumnType("time")
	UnknownType = ColumnType("unknown")
)

Variables

This section is empty.

Functions

func BeginTransaction added in v0.8.1

func BeginTransaction(ctx fns.Context) (err errors.CodeError)

func BeginTransactionWithOption added in v0.8.1

func BeginTransactionWithOption(ctx fns.Context, param BeginTransactionParam) (err errors.CodeError)

func CommitTransaction added in v0.8.1

func CommitTransaction(ctx fns.Context) (err errors.CodeError)

func RollbackTransaction added in v0.8.1

func RollbackTransaction(ctx fns.Context) (err errors.CodeError)

func Service

func Service() fns.Service

Types

type BeginTransactionParam added in v0.8.1

type BeginTransactionParam struct {
	Timeout   time.Duration     `json:"timeout,omitempty"`
	Isolation db.IsolationLevel `json:"isolation,omitempty"`
}

func DefaultTransactionOption added in v0.8.1

func DefaultTransactionOption() (v BeginTransactionParam)

func TransactionOption added in v0.8.1

func TransactionOption(timeout string, isolation db.IsolationLevel) (v BeginTransactionParam)

type Client

type Client interface {
	Reader() (v *db.DB)
	Writer() (v *db.DB)
	Close() (err error)
}

type Cluster

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

func NewCluster

func NewCluster(databases []*db.DB) (client *Cluster)

func (*Cluster) Close

func (client *Cluster) Close() (err error)

func (*Cluster) Reader

func (client *Cluster) Reader() (v *db.DB)

func (*Cluster) Writer

func (client *Cluster) Writer() (v *db.DB)

type Column

type Column struct {
	Type  ColumnType      `json:"type,omitempty"`
	Name  string          `json:"name,omitempty"`
	Value json.RawMessage `json:"value,omitempty"`
	Nil   bool            `json:"nil,omitempty"`
}

func (*Column) Decode added in v0.9.6

func (c *Column) Decode(v interface{}) (err error)

type ColumnScanner added in v0.9.6

type ColumnScanner struct {
	Column
	// contains filtered or unexported fields
}

func NewColumnScanner added in v0.9.6

func NewColumnScanner(ct *db.ColumnType) (scanner *ColumnScanner)

func (*ColumnScanner) Scan added in v0.9.6

func (c *ColumnScanner) Scan(src interface{}) error

type ColumnType

type ColumnType string

type Config

type Config struct {
	Driver           string   `json:"driver"`
	MasterSlaverMode bool     `json:"masterSlaverMode,omitempty"`
	DSN              []string `json:"dsn,omitempty"`
	MaxIdles         int      `json:"maxIdles,omitempty"`
	MaxOpens         int      `json:"maxOpens,omitempty"`
	EnableDebugLog   bool     `json:"enableDebugLog"`
}

func (*Config) CreateClient

func (config *Config) CreateClient() (client Client, err error)

type ExecResult

type ExecResult struct {
	Affected     int64 `json:"affected,omitempty"`
	LastInsertId int64 `json:"lastInsertId,omitempty"`
}

func Execute

func Execute(ctx fns.Context, param Param) (result *ExecResult, err errors.CodeError)

type Executor

type Executor interface {
	ExecContext(ctx context.Context, query string, args ...interface{}) (db.Result, error)
}

type FieldColumn added in v0.3.10

type FieldColumn struct {
	Kind      string
	FieldType reflect.Type
	Column    *Column
}

type GlobalTransaction

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

type GlobalTransactionManagement

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

func NewGlobalTransactionManagement

func NewGlobalTransactionManagement() *GlobalTransactionManagement

func (*GlobalTransactionManagement) Begin added in v0.4.2

func (gtm *GlobalTransactionManagement) Begin(ctx fns.Context, db0 *db.DB, isolation db.IsolationLevel, timeout time.Duration) (err error)

func (*GlobalTransactionManagement) Close

func (gtm *GlobalTransactionManagement) Close()

func (*GlobalTransactionManagement) Commit added in v0.4.2

func (gtm *GlobalTransactionManagement) Commit(ctx fns.Context) (err error)

func (*GlobalTransactionManagement) Get

func (gtm *GlobalTransactionManagement) Get(ctx fns.Context) (tx *db.Tx, has bool)

func (*GlobalTransactionManagement) Rollback added in v0.4.2

func (gtm *GlobalTransactionManagement) Rollback(ctx fns.Context)

type KDB

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

func (*KDB) Key

func (k *KDB) Key() string

type MasterSlaver

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

func NewMasterSlaver

func NewMasterSlaver(master *db.DB, slavers []*db.DB) (client *MasterSlaver)

func (*MasterSlaver) Close

func (client *MasterSlaver) Close() (err error)

func (*MasterSlaver) Reader

func (client *MasterSlaver) Reader() (v *db.DB)

func (*MasterSlaver) Writer

func (client *MasterSlaver) Writer() (v *db.DB)

type NullJson

type NullJson struct {
	Json  json.RawMessage
	Valid bool
}

func (*NullJson) Scan

func (v *NullJson) Scan(src interface{}) error

type NullSQLRaw

type NullSQLRaw struct {
	Raw   db.RawBytes
	Valid bool
}

func (*NullSQLRaw) Scan

func (v *NullSQLRaw) Scan(src interface{}) error

type Param

type Param struct {
	Query string `json:"query,omitempty"`
	Args  *Tuple `json:"args,omitempty"`
}

type QueryAble

type QueryAble interface {
	QueryContext(ctx context.Context, query string, args ...interface{}) (*db.Rows, error)
}

type Row

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

func (*Row) Column added in v0.9.6

func (r *Row) Column(name string, value interface{}) (has bool, err error)

func (*Row) Columns

func (r *Row) Columns() (columns []*Column)

func (*Row) Empty added in v0.9.6

func (r *Row) Empty() (ok bool)

func (*Row) MarshalJSON added in v0.9.6

func (r *Row) MarshalJSON() (p []byte, err error)

func (*Row) UnmarshalJSON added in v0.9.6

func (r *Row) UnmarshalJSON(p []byte) (err error)

type Rows

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

func NewRows

func NewRows(raws *db.Rows) (r *Rows, err error)

func Query

func Query(ctx fns.Context, param Param) (rows *Rows, err errors.CodeError)

func (*Rows) Empty

func (r *Rows) Empty() (ok bool)

func (*Rows) MarshalJSON added in v0.9.6

func (r *Rows) MarshalJSON() (p []byte, err error)

func (*Rows) Next added in v0.9.6

func (r *Rows) Next() (v *Row, has bool)

func (*Rows) Size

func (r *Rows) Size() int

func (*Rows) UnmarshalJSON added in v0.9.6

func (r *Rows) UnmarshalJSON(p []byte) (err error)

type Standalone

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

func NewStandalone

func NewStandalone(v *db.DB) (client *Standalone)

func (*Standalone) Close

func (client *Standalone) Close() (err error)

func (*Standalone) Reader

func (client *Standalone) Reader() (v *db.DB)

func (*Standalone) Writer

func (client *Standalone) Writer() (v *db.DB)

type Tuple

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

func NewTuple

func NewTuple() *Tuple

func (*Tuple) Append

func (t *Tuple) Append(values ...interface{}) *Tuple

func (Tuple) MarshalJSON

func (t Tuple) MarshalJSON() (p []byte, err error)

func (*Tuple) Merge added in v0.9.6

func (t *Tuple) Merge(v *Tuple) *Tuple

func (*Tuple) Size added in v0.9.6

func (t *Tuple) Size() (n int)

func (Tuple) String added in v0.9.8

func (t Tuple) String() (s string)

func (*Tuple) UnmarshalJSON

func (t *Tuple) UnmarshalJSON(p []byte) (err error)

type TxAddress

type TxAddress struct {
	Address string `json:"address,omitempty"`
}

Jump to

Keyboard shortcuts

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