Documentation
¶
Index ¶
- func Validate(attrs Model, partial bool) error
- type Engine
- func (engine *Engine) Count() (int64, error)
- func (engine *Engine) Delete() (sql.Result, error)
- func (engine *Engine) Execute(query string, args ...any) (sql.Result, error)
- func (engine *Engine) Exists() (bool, error)
- func (engine Engine) Fields(fields ...string) *Engine
- func (engine *Engine) First(queryResult any) error
- func (engine Engine) GetSQL() string
- func (engine Engine) GroupBy(groups ...string) *Engine
- func (engine *Engine) Insert(model Model) (sql.Result, error)
- func (engine *Engine) Migrate(schema string, model Model)
- func (engine Engine) Name() string
- func (engine Engine) OrderBy(orders ...string) *Engine
- func (engine *Engine) Page(page int64, pageSize int64) (int64, int64, error)
- func (engine *Engine) Query(query string, args ...any) (*sql.Rows, error)
- func (engine *Engine) QueryRow(query string, args ...any) *sql.Row
- func (engine *Engine) Select(queryResult any) error
- func (engine *Engine) SetModel(model Model) *Engine
- func (engine *Engine) Update(model Model) (sql.Result, error)
- func (engine Engine) Where(query string, args ...any) *Engine
- func (engine Engine) WithTransaction(transactionFunc TransactionFunc, args ...any) (err error)
- type MigrationsHandler
- type Model
- type Settings
- type TransactionFunc
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
Types ¶
type Engine ¶
Engine 结构体用于管理 SQL Server 数据库连接和操作
func Connect ¶
Connect 连接 SQL Server 数据库
参数:
- UseDatabases: string 数据库配置名称
返回:
- *Engine: SQL Server 数据库操作实例
说明:
- 从全局配置中获取数据库连接信息
- 如果 Engine 不匹配则 panic
- 需要手动添加 _ "github.com/denisenkom/go-mssqldb" 包
func ConnectDatabase ¶
ConnectDatabase 连接 SQL Server 数据库
参数:
- UseDatabases: string 数据库配置名称
- database: *goi.Database 数据库连接管理器
返回:
- *Engine: SQL Server 数据库操作实例
说明:
- 如果 Engine 不匹配则 panic
- 需要手动添加 _ "github.com/denisenkom/go-mssqldb" 包
func (*Engine) Count ¶
Count 统计符合当前条件的记记录数
返回:
- int64: 满足当前 WHERE 条件的记录总数
- error: 查询过程中的错误
说明:
- 必须先通过 SetModel 设置数据模型
- 会根据当前设置的 WHERE 条件生成 COUNT 语句
- 查询失败时返回0和错误信息
func (*Engine) Delete ¶
Delete 删除符合条件的记录
返回:
- sql.Result: 删除操作的结果
- error: 删除过程中的错误
说明:
- 调用前必须先通过 SetModel 设置数据模型
- 会根据当前设置的 WHERE 条件生成 DELETE 语句
- 未设置 WHERE 条件时将删除整张表中的所有记录,使用时需谨慎
func (*Engine) Execute ¶
Execute 执行 SQL 语句
参数:
- query: string SQL语句,使用 ? 作为占位符,例如: "id = ? AND status IN (?)"
- args: ...any SQL参数值列表
返回:
- sql.Result: 执行操作的结果
- error: 执行过程中的错误
说明:
- 使用 ? 作为统一占位符,最终会被转换为 SQL Server 的 @p1,@p2,... 格式
- 支持在事务中使用
func (*Engine) Exists ¶
Exists 判断是否存在符合条件的记录
返回:
- bool: 是否存在至少一条满足条件的记录
- error: 查询过程中的错误
说明:
- 必须先通过 SetModel 设置数据模型
- 会根据当前 WHERE 条件生成 SELECT 1 FROM "table" ...
- 使用 QueryRow 执行,若返回 sql.ErrNoRows 则视为不存在(false, nil)
- 其他错误会原样返回
func (Engine) Fields ¶
Fields 指定查询要返回的字段
参数:
- fields: ...string 要查询的字段名列表(模型结构体中的字段名)
返回:
- *Engine: 当前实例的副本指针,支持链式调用
说明:
- 字段名必须是模型结构体中已定义的字段
- 只返回带有 field_type 标签的字段,未标记的字段会被忽略
- 字段名大小写不敏感,会自动转换为数据库字段名
- 数据库字段名默认使用字段名的小写形式,或由 field_name 标签显式指定
- 如果字段不存在则会 panic
func (*Engine) First ¶
First 获取查询结果的第一条记录
参数:
- queryResult: *struct{} 或 map[string]any / *map[string]any,用于接收结果的结构体指针或 map
返回:
- error: 查询过程中的错误
说明:
- 必须传入结构体指针或 map/map 指针
- 自动映射数据库字段到结构体字段或 map 键
- 无记录时返回 sql.ErrNoRows
- 查询失败时返回错误信息
func (Engine) GroupBy ¶
GroupBy 设置分组条件
参数:
- groups: ...string 分组字段名列表
返回:
- *Engine: 当前实例的副本指针,支持链式调用
说明:
- 字段名会被自动去除首尾空格和引号
- 字段名最终会使用 SQL Server 的方括号引用: [column]
- 空字段名会被忽略
- 多次调用会覆盖之前的分组设置
func (*Engine) Insert ¶
Insert 向数据库插入一条记录
参数:
- model: Model 要插入的数据模型实例
返回:
- sql.Result: 插入操作的结果
- error: 插入过程中的错误
说明:
- 调用前必须先通过 SetModel 设置数据模型
- 支持指针和非指针类型的字段值
- 只插入带有 field_type 标签的字段
Example ¶
package main
import (
"fmt"
"time"
"github.com/NeverStopDreamingWang/goi/v2"
"github.com/NeverStopDreamingWang/goi/v2/db"
"github.com/NeverStopDreamingWang/goi/v2/db/sqlserver"
)
type UserModel struct {
ID *int64 `field_name:"id" field_type:"BIGINT IDENTITY(1,1) PRIMARY KEY" json:"id"`
Username *string `field_name:"username" field_type:"NVARCHAR(255) NOT NULL" json:"username"`
Password *string `field_name:"password" field_type:"NVARCHAR(255) NOT NULL" json:"-"`
CreateTime *string `field_name:"create_time" field_type:"DATETIME2 DEFAULT SYSDATETIME()" json:"create_time"`
UpdateTime *string `field_name:"update_time" field_type:"DATETIME2" json:"update_time"`
}
func (userModel UserModel) ModelSet() *sqlserver.Settings {
encryptFields := []string{
"username",
"password",
}
modelSettings := &sqlserver.Settings{
MigrationsHandler: sqlserver.MigrationsHandler{
BeforeHandler: nil,
AfterHandler: nil,
},
TableName: "user_tb",
Settings: goi.Params{
"encrypt_fields": encryptFields,
},
}
return modelSettings
}
func main() {
mssqlDB := db.Connect[*sqlserver.Engine]("sqlserver_default")
username := "test_user"
password := "test123456"
now := time.Now().Format(time.DateTime)
user := UserModel{
Username: &username,
Password: &password,
CreateTime: &now,
}
mssqlDB.SetModel(UserModel{})
if _, err := mssqlDB.Insert(user); err != nil {
fmt.Println("插入错误:", err)
return
}
fmt.Println("插入成功")
}
Output:
func (*Engine) Migrate ¶
Migrate 根据模型创建数据库表
参数:
- schema: string 数据库名称,如果连接字符串中已指定数据库则可以传入空字符串
- model: Model 数据模型
说明:
- SQL Server 默认 schema 为 dbo
- 检查表是否已存在,存在则跳过创建
- 解析模型结构体的字段标签
- 支持自定义迁移前后处理函数
- 创建失败时会panic
Example ¶
package main
import (
"github.com/NeverStopDreamingWang/goi/v2"
"github.com/NeverStopDreamingWang/goi/v2/db"
"github.com/NeverStopDreamingWang/goi/v2/db/sqlserver"
)
type UserModel struct {
ID *int64 `field_name:"id" field_type:"BIGINT IDENTITY(1,1) PRIMARY KEY" json:"id"`
Username *string `field_name:"username" field_type:"NVARCHAR(255) NOT NULL" json:"username"`
Password *string `field_name:"password" field_type:"NVARCHAR(255) NOT NULL" json:"-"`
CreateTime *string `field_name:"create_time" field_type:"DATETIME2 DEFAULT SYSDATETIME()" json:"create_time"`
UpdateTime *string `field_name:"update_time" field_type:"DATETIME2" json:"update_time"`
}
func (userModel UserModel) ModelSet() *sqlserver.Settings {
encryptFields := []string{
"username",
"password",
}
modelSettings := &sqlserver.Settings{
MigrationsHandler: sqlserver.MigrationsHandler{
BeforeHandler: nil,
AfterHandler: nil,
},
TableName: "user_tb",
Settings: goi.Params{
"encrypt_fields": encryptFields,
},
}
return modelSettings
}
func main() {
mssqlDB := db.Connect[*sqlserver.Engine]("sqlserver_default")
mssqlDB.Migrate("dbo", UserModel{})
}
Output:
func (Engine) OrderBy ¶
OrderBy 设置排序条件
参数:
- orders: ...string 排序字段列表,支持前缀 "-" 表示倒序,例如: "name", "-created_at"
返回:
- *Engine: 当前实例的副本指针,支持链式调用
说明:
- 字段名会被自动去除首尾空格和引号
- 不带前缀时使用 ASC 升序,带 "-" 前缀时使用 DESC 降序
- 字段名最终会使用 SQL Server 的方括号引用: [column] ASC/DESC
- 多次调用会覆盖之前的排序设置
func (*Engine) Page ¶
Page 设置分页参数
参数:
- page: int64 页码,从 1 开始
- pageSize: int64 每页记录数
返回:
- int64: 总记录数
- int64: 总页数
- error: 查询过程中的错误
说明:
- 页码小于等于 0 时自动设为 1
- 每页记录数小于等于 0 时设为默认值 10
- 总页数根据总记录数和每页记录数计算
- 会自动执行一次 Count 查询获取总记录数
- SQL Server 使用 OFFSET ... ROWS FETCH NEXT ... ROWS ONLY 实现分页
- 注意:SQL Server 的 OFFSET/FETCH 语法必须配合 ORDER BY 使用,请确保调用 OrderBy 方法
func (*Engine) Query ¶
Query 执行查询 SQL 语句
参数:
- query: string SQL查询语句,使用 ? 作为占位符,例如: "id = ? AND status IN (?)"
- args: ...any SQL参数值列表
返回:
- *sql.Rows: 查询结果集
- error: 查询过程中的错误
说明: - 使用 ? 作为统一占位符,最终会被转换为 SQL Server 的 @p1,@p2,... 格式 - 返回的结果集需要调用方手动关闭 - 查询失败时返回nil和错误信息 - 支持在事务中使用
func (*Engine) QueryRow ¶
QueryRow 执行查询 SQL 语句
参数:
- query: string SQL查询语句,使用 ? 作为占位符,例如: "id = ? AND status IN (?)"
- args: ...any SQL参数值列表
返回:
- *sql.Row: 查询结果行
说明:
- 使用 ? 作为统一占位符,最终会被转换为 SQL Server 的 @p1,@p2,... 格式
- 查询失败时返回nil
- 支持在事务中使用
func (*Engine) Select ¶
Select 执行查询并将结果扫描到切片中
参数:
- queryResult: *[]T 或 []*T,用于接收结果的切片指针,其中 T 可以是 struct 或 map 类型
返回:
- error: 查询过程中的错误
说明:
- 必须传入切片指针,且元素类型为结构体或 map
- 支持指针和非指针类型的结构体元素([]T / []*T)
- 会根据 SetModel/Fields 解析的字段集合,自动将数据库字段映射到结构体字段或 map 键上
- 查询结束后会检查 rows.Err(),不会静默吞掉迭代过程中的错误
func (*Engine) SetModel ¶
SetModel 设置当前操作的数据模型
参数:
- model: Model 要设置的数据模型实例
返回:
- *Engine: 当前 Engine 指针,支持链式调用
说明:
- 会重置内部的字段缓存、条件、排序、分组、分页等状态
- 只解析带有 field_type 标签的结构体字段
- 数据库字段名默认使用字段名的小写形式,或由 field_name 标签显式指定
func (*Engine) Update ¶
Update 更新符合条件的记录
参数:
- model: Model 要更新的数据模型实例
返回:
- sql.Result: 更新操作的结果
- error: 更新过程中的错误
说明:
- 调用前必须先通过 SetModel 设置数据模型
- 只更新非空字段
- 支持指针和非指针类型的字段值
- 会根据当前设置的 WHERE 条件生成 UPDATE 语句
func (Engine) Where ¶
Where 构造 WHERE 条件
参数:
- query: string 条件语句,使用 ? 作为占位符,例如: "id = ? AND status IN (?)"
- args: ...any 对应占位符的参数列表,支持基本类型和切片/数组
返回:
- *Engine: 当前实例的副本指针,支持链式调用
说明:
- 支持多次调用,条件之间使用 AND 连接
- 使用 ? 作为统一占位符,最终会在 Execute/Query 中被转换为 SQL Server 的 @p1,@p2,... 格式
- 对切片/数组参数会自动展开为 IN (...) 形式,占位符数量与元素个数一致
- 空切片/数组会被当作普通参数处理,此时生成的 SQL 可能不是预期的 IN () 语义,应在业务层避免传入空集合
func (Engine) WithTransaction ¶
func (engine Engine) WithTransaction(transactionFunc TransactionFunc, args ...any) (err error)
WithTransaction 使用事务执行函数
参数:
- transactionFunc: TransactionFunc func(engine *Engine, args ...any) error 事务执行函数
- args: ...any 传递给事务函数的参数列表
返回:
- error: 事务执行的错误,发生错误时会自动回滚
说明:
- 使用值接收者,在事务内部会基于当前 Engine 复制一个副本,避免事务内外状态互相干扰
- 不支持嵌套事务,如果当前已在事务中则返回错误
- 事务函数执行失败时自动回滚,支持内部 panic
type MigrationsHandler ¶
type MigrationsHandler struct {
BeforeHandler func() error // 迁移之前处理函数
AfterHandler func() error // 迁移之后处理函数
}
迁移处理函数