sqlmer

package module
v1.3.2 Latest Latest
Warning

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

Go to latest
Published: Apr 7, 2022 License: MIT Imports: 5 Imported by: 0

README

sqlmer

Go

功能简介

数据库访问库,目前支持 MySQL 和 SQL Server。

  • SQL语句提供了统一的 命名参数索引参数 语法,可直观的使用 map 作为SQL语句参数,并以 map 或 slice 方式返回;
  • 提供了面向map的 参数结果集 交互接口,事务和非事务访问均可通过相同接口完成;
  • 扩展了原生 sql.Rows / sql.Row,使其支持 MapScan 以及 SliceScan;

API文档

https://pkg.go.dev/github.com/bunnier/sqlmer

Tips: 主交互接口为DbClient

简单样例

func main() {
	// 获取 DbClient,这里使用 SqlServer 做示范,MySQL 也提供了一致的 API 和相应的参数解析逻辑。
	dbClient, err := mssql.NewMsSqlDbClient(
		"server=127.0.0.1:1433; database=test; user id=dev;password=qwer1234;",
		sqlmer.WithConnTimeout(time.Second*15), // 连接超时。
		sqlmer.WithExecTimeout(time.Second*15), // 读写超时(执行语句时候,如果没有指定超时时间,默认用这个)。
	)
	if err != nil {
		fmt.Println(err)
		return
	}

	// 创建测试表。
	_, err = dbClient.Execute(`
CREATE TABLE MainDemo(
	Id INT PRIMARY KEY IDENTITY(1,1) NOT NULL,
	Name VARCHAR(10) NOT NULL,
	Age INT NOT NULL
)`)
	if err != nil {
		log.Fatal(err)
		return
	}

	// 有超时时间的查询。
	ctx, cancel := context.WithTimeout(context.Background(), time.Second*1)
	defer cancel()
	_, err = dbClient.ExecuteContext(ctx, "WAITFOR DELAY '00:00:02'")
	if err != nil {
		fmt.Println("timeout: " + err.Error()) // 预期内的超时~
	}

	// 索引方式插入数据,@p1...@pn,分别对应第 1-n 个参数。
	_, err = dbClient.Execute("INSERT INTO MainDemo(Name, Age) VALUES(@p1, @p2)", "rui", 1)
	if err != nil {
		log.Fatal(err)
		return
	}
	_, err = dbClient.Execute("INSERT INTO MainDemo(Name, Age) VALUES(@p1, @p2)", "bao", 2)
	if err != nil {
		log.Fatal(err)
		return
	}

	// 命名参数查询数据,命名参数采用 map,key 为 sql 语句 @ 之后的参数名,value 为值。
	data, err := dbClient.Get("SELECT * FROM MainDemo WHERE Name=@name", map[string]interface{}{"name": "rui"})
	if err != nil {
		log.Fatal(err)
		return
	}
	fmt.Println(data) // map 方式返回,需要结构的,需要自己转换。

	// 获取第一行第一列,返回的第二个值标示是否为 null,主要用于 nullable 列。
	name, _, err := dbClient.Scalar("SELECT Name FROM MainDemo WHERE Name=@p1", "rui")
	if err != nil {
		log.Fatal(err)
		return
	}
	
	// 返回interface{},类型可以自己转换。已经统一了 Sql Server 和 MySQL 返回的类型。
	fmt.Println(name.(string)) 

	// 获取增强后的sql.Rows(支持SliceScan、MapScan)。
	sliceRows, err := dbClient.Rows("SELECT Name, GETDATE() FROM MainDemo WHERE Name IN (@p1, @p2)", "rui", "bao")
	if err != nil {
		log.Fatal(err)
		return
	}
	for sliceRows.Next() {
		sliceRow, err := sliceRows.SliceScan() // SliceScan 用 []interface{} 方式返回。
		if err != nil {
			log.Fatal(err)
			return
		}
		fmt.Println(sliceRow...)
	}

	if sliceRows.Err() != nil {
		log.Fatal(err)
		return
	}

	// 删除测试表。
	_, err = dbClient.Execute("DROP TABLE MainDemo")
	if err != nil {
		log.Fatal(err)
		return
	}
}

类型映射

nullable 的字段,如果值为 null,默认均以 nil 返回。

MySql
DB datatype Go datatype
varchar / char / text string
tiny int / small int / int / unsigned int / bigint int64
float / double float64
decimal string
date / datetime / timestamp time.Time
bit (binary) []byte
SQL Server
DB datatype Go datatype
nvarchar / nchar / varchar / char / text string
small int / tiny int / int / bigint int64
float float64
money / decimal string
date / datetime / datetime2 / time time.Time
bit (boolean) bool

测试用例

测试用例 Schema:

  1. 编辑 test_conf.yml 文件,相应数据库的连接字符串;
  2. 如果第 1 步配置的连接字符串有 DDL 权限,可通过调用 go run ./internal/testcmd/main.go -a PREPARE -c test_conf.yml 来同时准备 MySQL / SQL Server 环境,如果没有 DDL 权限可自行直接执行 internal/testenv/*_prepare.sql 准备环境;
  3. 如果第 1 步配置的连接字符串有 DDL 权限,测试结束后可以通过 go run ./internal/testcmd/main.go -a CLEAN -c test_conf.yml 销毁测试表,如果没有 DDL 权限可自行直接执行 internal/testenv/*_clean.sql 销毁测试表;

另外,如果你和我一样使用 VSCode 作为开发工具,可在配置好 test_conf.yml 之后,直接使用 .vscode 中编写好的 Task 来准备环境。

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ErrConnect = errors.New("sqlmer: connect")

ErrConnect 是数据库连接相关错误。

View Source
var ErrSql = errors.New("sqlmer: sql")

ErrSql 是SQL语句相关错误。

View Source
var ErrTran = errors.New("sqlmer: transaction")

ErrTran 是数据库事务相关错误。

Functions

This section is empty.

Types

type AbstractDbClient added in v1.2.0

type AbstractDbClient struct {
	SqlDB *sql.DB              // 内部依赖的连接池。
	Exer  sqlen.EnhancedDbExer // 获取方法实际使用的执行对象。
	// contains filtered or unexported fields
}

AbstractDbClient 是一个 DbClient 的抽象实现。

func NewInternalDbClient added in v1.2.0

func NewInternalDbClient(config *DbClientConfig) (AbstractDbClient, error)

NewInternalDbClient 用于获取一个 internalDbClient 对象。

func (*AbstractDbClient) ConnectionString added in v1.2.0

func (client *AbstractDbClient) ConnectionString() string

ConnectionString 用于获取当前实例所使用的数据库连接字符串。

func (*AbstractDbClient) CreateTransaction added in v1.2.0

func (client *AbstractDbClient) CreateTransaction() (TransactionKeeper, error)

CreateTransaction 用于开始一个事务。

func (*AbstractDbClient) Execute added in v1.2.0

func (client *AbstractDbClient) Execute(sqlText string, args ...interface{}) (int64, error)

Execute 用于执行非查询SQL语句,并返回所影响的行数。

func (*AbstractDbClient) ExecuteContext added in v1.2.0

func (client *AbstractDbClient) ExecuteContext(ctx context.Context, sqlText string, args ...interface{}) (int64, error)

ExecuteContext 用于执行非查询 sql 语句,并返回所影响的行数。

func (*AbstractDbClient) Exists added in v1.2.0

func (client *AbstractDbClient) Exists(sqlText string, args ...interface{}) (bool, error)

Exists 用于判断给定的查询的结果是否至少包含 1 行。

func (*AbstractDbClient) ExistsContext added in v1.2.0

func (client *AbstractDbClient) ExistsContext(ctx context.Context, sqlText string, args ...interface{}) (bool, error)

ExistsContext 用于判断给定的查询的结果是否至少包含 1 行。

func (*AbstractDbClient) Get added in v1.2.0

func (client *AbstractDbClient) Get(sqlText string, args ...interface{}) (map[string]interface{}, error)

Get 用于获取查询结果的第一行记录。

func (*AbstractDbClient) GetContext added in v1.2.0

func (client *AbstractDbClient) GetContext(ctx context.Context, sqlText string, args ...interface{}) (map[string]interface{}, error)

GetContext 用于获取查询结果的第一行记录。

func (*AbstractDbClient) MustCreateTransaction added in v1.2.0

func (client *AbstractDbClient) MustCreateTransaction() TransactionKeeper

MustCreateTransaction 用于开始一个事务。

func (*AbstractDbClient) MustExecute added in v1.2.0

func (client *AbstractDbClient) MustExecute(sqlText string, args ...interface{}) int64

MustExecute 用于执行非查询 sql 语句,并返回所影响的行数。

func (*AbstractDbClient) MustExecuteContext added in v1.2.0

func (client *AbstractDbClient) MustExecuteContext(ctx context.Context, sqlText string, args ...interface{}) int64

MustExecuteContext 用于执行非查询 sql 语句,并返回所影响的行数。

func (*AbstractDbClient) MustExists added in v1.2.0

func (client *AbstractDbClient) MustExists(sqlText string, args ...interface{}) bool

MustExists 用于判断给定的查询的结果是否至少包含 1 行。 注意:当查询不到行时候,将返回 false,而不是 panic。

func (*AbstractDbClient) MustExistsContext added in v1.2.0

func (client *AbstractDbClient) MustExistsContext(ctx context.Context, sqlText string, args ...interface{}) bool

MustExistsContext 用于判断给定的查询的结果是否至少包含 1 行。 注意:当查询不到行时候,将返回 false,而不是 panic。

func (*AbstractDbClient) MustGet added in v1.2.0

func (client *AbstractDbClient) MustGet(sqlText string, args ...interface{}) map[string]interface{}

MustGet 用于获取查询结果的第一行记录。 注意:当查询不到行时候,将返回 nil,而不是 panic。

func (*AbstractDbClient) MustGetContext added in v1.2.0

func (client *AbstractDbClient) MustGetContext(ctx context.Context, sqlText string, args ...interface{}) map[string]interface{}

MustGetContext 用于获取查询结果的第一行记录。 注意:当查询不到行时候,将返回 nil,而不是 panic。

func (*AbstractDbClient) MustRow added in v1.2.0

func (client *AbstractDbClient) MustRow(sqlText string, args ...interface{}) *sqlen.EnhanceRow

MustRow 用于获取单个查询结果行。

func (*AbstractDbClient) MustRowContext added in v1.2.0

func (client *AbstractDbClient) MustRowContext(ctx context.Context, sqlText string, args ...interface{}) *sqlen.EnhanceRow

RowMustRowContextContext 用于获取单个查询结果行。

func (*AbstractDbClient) MustRows added in v1.2.0

func (client *AbstractDbClient) MustRows(sqlText string, args ...interface{}) *sqlen.EnhanceRows

MustRows 用于获取读取数据的游标 sql.Rows。

func (*AbstractDbClient) MustRowsContext added in v1.2.0

func (client *AbstractDbClient) MustRowsContext(ctx context.Context, sqlText string, args ...interface{}) *sqlen.EnhanceRows

MustRowsContext 用于获取读取数据的游标 sql.Rows。

func (*AbstractDbClient) MustScalar added in v1.2.0

func (client *AbstractDbClient) MustScalar(sqlText string, args ...interface{}) (interface{}, bool)

MustScalar 用于获取查询的第一行第一列的值。 注意,sql.ErrNoRows 不会引发 panic,而通过第二个返回值区分,当查询不到数据的时候第二个返回值将为 false,否则为 true。

func (*AbstractDbClient) MustScalarContext added in v1.2.0

func (client *AbstractDbClient) MustScalarContext(ctx context.Context, sqlText string, args ...interface{}) (interface{}, bool)

MustScalarContext 用于获取查询的第一行第一列的值。 注意,sql.ErrNoRows 不会引发 panic,而通过第二个返回值区分,当查询不到数据的时候第二个返回值将为 false,否则为 true。

func (*AbstractDbClient) MustSizedExecute added in v1.2.0

func (client *AbstractDbClient) MustSizedExecute(expectedSize int64, sqlText string, args ...interface{})

MustSizedExecute 用于执行非查询 sql 语句,并断言所影响的行数。

func (*AbstractDbClient) MustSizedExecuteContext added in v1.2.0

func (client *AbstractDbClient) MustSizedExecuteContext(ctx context.Context, expectedSize int64, sqlText string, args ...interface{})

MustSizedExecuteContext 用于执行非查询 sql 语句,并断言所影响的行数。

func (*AbstractDbClient) MustSliceGet added in v1.2.0

func (client *AbstractDbClient) MustSliceGet(sqlText string, args ...interface{}) []map[string]interface{}

MustSliceGet 用于获取查询结果得行序列。 注意:当查询不到行时候,将返回 nil,而不是 panic。

func (*AbstractDbClient) MustSliceGetContext added in v1.2.0

func (client *AbstractDbClient) MustSliceGetContext(ctx context.Context, sqlText string, args ...interface{}) []map[string]interface{}

MustSliceGetContext 用于获取查询结果得行序列。 注意:当查询不到行时候,将返回 nil,而不是 panic。

func (*AbstractDbClient) Row added in v1.2.0

func (client *AbstractDbClient) Row(sqlText string, args ...interface{}) (*sqlen.EnhanceRow, error)

Row 用于获取单个查询结果行。

func (*AbstractDbClient) RowContext added in v1.2.0

func (client *AbstractDbClient) RowContext(ctx context.Context, sqlText string, args ...interface{}) (*sqlen.EnhanceRow, error)

RowContext 用于获取单个查询结果行。

func (*AbstractDbClient) Rows added in v1.2.0

func (client *AbstractDbClient) Rows(sqlText string, args ...interface{}) (*sqlen.EnhanceRows, error)

Rows 用于获取读取数据的游标 sql.Rows。

func (*AbstractDbClient) RowsContext added in v1.2.0

func (client *AbstractDbClient) RowsContext(ctx context.Context, sqlText string, args ...interface{}) (*sqlen.EnhanceRows, error)

RowsContext 用于获取读取数据的游标 sql.Rows。

func (*AbstractDbClient) Scalar added in v1.2.0

func (client *AbstractDbClient) Scalar(sqlText string, args ...interface{}) (interface{}, bool, error)

Scalar 用于获取查询的第一行第一列的值。 注意,sql.ErrNoRows 不放 error 中返回,而通过第二个返回值区分,当查询不到数据的时候第二个返回值将为 false,否则为 true。

func (*AbstractDbClient) ScalarContext added in v1.2.0

func (client *AbstractDbClient) ScalarContext(ctx context.Context, sqlText string, args ...interface{}) (interface{}, bool, error)

ScalarContext 用于获取查询的第一行第一列的值。 注意,sql.ErrNoRows 不放 error 中返回,而通过第二个返回值区分,当查询不到数据的时候第二个返回值将为 false,否则为 true。

func (*AbstractDbClient) SizedExecute added in v1.2.0

func (client *AbstractDbClient) SizedExecute(expectedSize int64, sqlText string, args ...interface{}) error

SizedExecute 用于执行非查询 sql 语句,并断言所影响的行数。若影响的函数不正确,抛出异常。

func (*AbstractDbClient) SizedExecuteContext added in v1.2.0

func (client *AbstractDbClient) SizedExecuteContext(ctx context.Context, expectedSize int64, sqlText string, args ...interface{}) error

SizedExecuteContext 用于执行非查询 sql 语句,并断言所影响的行数。若影响的函数不正确,抛出异常。

func (*AbstractDbClient) SliceGet added in v1.2.0

func (client *AbstractDbClient) SliceGet(sqlText string, args ...interface{}) ([]map[string]interface{}, error)

SliceGet 用于获取查询结果得行序列。

func (*AbstractDbClient) SliceGetContext added in v1.2.0

func (client *AbstractDbClient) SliceGetContext(ctx context.Context, sqlText string, args ...interface{}) ([]map[string]interface{}, error)

SliceGetContext 用于获取查询结果得行序列。

type BindSqlArgsFunc

type BindSqlArgsFunc func(string, ...interface{}) (string, []interface{}, error)

BindSqlArgsFunc 定义用于预处理 sql 语句与参数的函数。

type DbClient

type DbClient interface {
	ConnectionString() string // ConnectionString 用于获取当前实例所使用的数据库连接字符串。
	// contains filtered or unexported methods
}

DbClient 定义了数据库访问客户端。

type DbClientConfig

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

func NewDbClientConfig

func NewDbClientConfig(options ...DbClientOption) (*DbClientConfig, error)

NewDbClientConfig 创建一个数据库连接配置。

type DbClientOption

type DbClientOption func(config *DbClientConfig) error

DbClientOption 是 DbClientConfig 的可选配置。

func WithBindArgsFunc

func WithBindArgsFunc(argsFunc BindSqlArgsFunc) DbClientOption

WithBindArgsFunc 用于为 DbClientConfig 设置处理参数的函数。

func WithConnTimeout

func WithConnTimeout(timeout time.Duration) DbClientOption

WithConnTimeout 用于为 DbClientConfig 设置获取数据库连接的超时时间。

func WithConnectionString added in v1.2.0

func WithConnectionString(driver string, connectionString string) DbClientOption

WithConnectionString 用于用现有的 sql.DB 初始化 DbClientOption。

func WithDb added in v1.2.0

func WithDb(db *sql.DB) DbClientOption

WithDb 用于用现有的 sql.DB 初始化 DbClientOption。

func WithExecTimeout

func WithExecTimeout(timeout time.Duration) DbClientOption

WithExecTimeout 用于为 DbClientConfig 设置默认的执行超时时间。

func WithPingCheck added in v1.2.0

func WithPingCheck(withPingCheck bool) DbClientOption

WithPingCheck 用于选择是否在初始化 DbClient 时候进行 ping 操作(默认为 false)。

func WithUnifyDataTypeFunc added in v1.3.1

func WithUnifyDataTypeFunc(unifyDataType sqlen.UnifyDataTypeFn) DbClientOption

WithUnifyDataTypeFunc 用于为 DbClient 注入驱动相关的类型转换逻辑。

type TransactionKeeper

type TransactionKeeper interface {
	DbClient // DbClient 实现了数据库访问客户端的功能。
	// contains filtered or unexported methods
}

TransactionKeeper 是一个定义数据库事务容器。

Directories

Path Synopsis
internal
testcmd command

Jump to

Keyboard shortcuts

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