前言
使用go-zero的脚手架工具goctl生成数据库代码时候,我们发现goctl引入了sqlx这个包来进行sql操作,本文旨在对sqlx包进行整理,来方便我们使用go-zero,sqlx进行sql操作
Why sqlx
为什么要额外引入sqlx包,增加复杂度,提高学习成本
1. sqlx在标准的database/sql包的基础上提供了更多的便捷功能,如结构体映射、更方便的查询参数处理等
2. sqlx允许开发者直接将数据库查询结果映射到Go的结构体中,这样可以避免手动扫描每个字段
3. sqlx兼容标准的database/sql包,这意味着开发者可以在不牺牲database/sql提供的任何功能的情况下,享受到sqlx带来的额外好处
4. sqlx支持上下文(context.Context)管理,可以方便地实现请求的超时控制、取消等功能
源代码
session接口
Session interface {Exec(query string, args ...any) (sql.Result, error)ExecCtx(ctx context.Context, query string, args ...any) (sql.Result, error)Prepare(query string) (StmtSession, error)PrepareCtx(ctx context.Context, query string) (StmtSession, error)QueryRow(v any, query string, args ...any) errorQueryRowCtx(ctx context.Context, v any, query string, args ...any) errorQueryRowPartial(v any, query string, args ...any) errorQueryRowPartialCtx(ctx context.Context, v any, query string, args ...any) errorQueryRows(v any, query string, args ...any) errorQueryRowsCtx(ctx context.Context, v any, query string, args ...any) errorQueryRowsPartial(v any, query string, args ...any) errorQueryRowsPartialCtx(ctx context.Context, v any, query string, args ...any) error}
Session接口中的函数提供了一系列数据库操作的方法
执行SQL命令
Exec(query string, args ...any) (sql.Result, error)
用于执行非查询SQL命令,如INSERT、UPDATE、DELETE等。适用于不需要返回结果集的操作。args参数用于SQL命令的参数化,以防止SQL注入攻击。
ExecCtx(ctx context.Context, query string, args ...any) (sql.Result, error)
类似于 Exec,但它允许传递一个 context.Context 对象,实现请求的超时、取消等上下文控制
准备SQL语句
Prepare(query string) (StmtSession, error):
用于预编译SQL语句以便多次执行。这可以提高性能并减少SQL注入的风险。返回的 StmtSession 可用于后续的执行或查询。
PrepareCtx(ctx context.Context, query string) (StmtSession, error):
类似于Prepare,但允许传递context.Context
查询单行数据
QueryRow(v any, query string, args ...any) error:
执行SQL查询并将单行结果直接映射到提供的变量中。适用于只期望返回单行数据的查询,如获取特定记录的详细信息。
QueryRowCtx(ctx context.Context, v any, query string, args ...any) error
类似于QueryRow,但包含上下文控制
QueryRowPartial(v any, query string, args ...any) error:
执行SQL查询并将结果部分映射到变量中,需要性能优化或只需要部分数据的情况下使用。
QueryRowPartialCtx(ctx context.Context, v any, query string, args ...any) error:
结合了部分查询和上下文管理
查询多行数据
QueryRows(v any, query string, args ...any) error:
执行SQL查询并将多行结果映射到提供的切片变量中。适用于需要返回多行数据的查询,如列出满足特定条件的所有记录。
QueryRowsCtx(ctx context.Context, v any, query string, args ...any) error:
类似于 `QueryRows`,但包含上下文控制
QueryRowsPartial(v any, query string, args ...any) error: 执行SQL查询并部分映射每行结果到切片中,用于只需要部分字段数据的场景。
QueryRowsPartialCtx(ctx context.Context, v any, query string, args ...any) error:
结合了部分多行查询和上下文管理
sqlconn接口
SqlConn interface {Session// RawDB is for other ORM to operate with, use it with caution.// Notice: don't close it.RawDB() (*sql.DB, error)Transact(fn func(Session) error) errorTransactCtx(ctx context.Context, fn func(context.Context, Session) error) error}
SqlConn
接口扩展了 Session
接口,并添加了一些专门用于处理数据库连接和事务的功能
RawDB() (*sql.DB, error)
:
返回原始的 *sql.DB
对象,使得开发者可以直接使用标准的 database/sql
包功能进行更底层或特定的数据库操作
Transact(fn func(Session) error) error
:
用于执行一个数据库事务。它接受一个函数作为参数,这个函数包含了要在事务中执行的所有数据库操作
TransactCtx(ctx context.Context, fn func(context.Context, Session) error) error
:
类似于 Transact
方法,但它允许传递一个 context.Context
对象