GoZero 微服务个人探究之路(十一)编写sql语句所用到的sqlx包

前言

使用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) error
		QueryRowCtx(ctx context.Context, v any, query string, args ...any) error
		QueryRowPartial(v any, query string, args ...any) error
		QueryRowPartialCtx(ctx context.Context, v any, query string, args ...any) error
		QueryRows(v any, query string, args ...any) error
		QueryRowsCtx(ctx context.Context, v any, query string, args ...any) error
		QueryRowsPartial(v any, query string, args ...any) error
		QueryRowsPartialCtx(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) error
		TransactCtx(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 对象

 

你可能感兴趣的:(go,sql,数据库)