Help us shape the future of Go! Take the 2026 Go Developer Survey

query

package
v1.0.1 Latest Latest
Warning

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

Go to latest
Published: Aug 20, 2026 License: MIT Imports: 1 Imported by: 0

Documentation

Overview

Package query 提供 SQL 语句的轻量分类工具。

注意:这是基于语句首关键字(leading keyword)的启发式判定,不依赖完整 SQL 解析器——足以支撑「读 vs 写」「是否需要二次确认」这类决策。它不保证对任意 复杂 SQL 的精确语义分析。

Package query 的占位符归一化子模块。

问题背景:不同数据库驱动对参数占位符的语法要求不一致:

  • MySQL / ClickHouse:database/sql 标准 "?" 占位符
  • PostgreSQL (pgx): "$1, $2, ..." 位置占位符
  • Oracle (go-ora): ":1, :2, ..." 或 ":name"

让用户为每种引擎记忆不同占位符体验很差。本模块约定:用户在 SQL 中 统一使用 "?" 作为占位符,由 CLI 层按当前驱动的 PlaceholderStyle 转换为 引擎原生占位符后再下发。

注意:本转换只识别「裸 ?」(作为参数占位符),不处理字符串字面量/注释内 出现的 ?(例如 WHERE name='a?b')。对于参数化查询场景这已足够——占位符 用于替换字面量,不应出现在字面量内部。若用户确需在字面量中包含 ?,请 直接用参数绑定(用占位符传入该值)。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func CountPlaceholders

func CountPlaceholders(sql string) int

CountPlaceholders 统计 SQL 中 "?" 占位符的数量,用于校验参数个数是否匹配。

func IsDestructive

func IsDestructive(sql string) bool

IsDestructive 粗略判断语句是否属于「高风险、可能造成数据丢失」类别, 用于触发交互式二次确认(安全守卫)。 包含:DROP / TRUNCATE,以及无 WHERE 的 DELETE / UPDATE。

func NormalizePlaceholders

func NormalizePlaceholders(sql string, style PlaceholderStyle) string

NormalizePlaceholders 把 SQL 中的 "?" 占位符按指定风格转换为引擎原生占位符。 仅当 style != StyleQuestion 时才发生替换;问号按出现顺序从 1 开始编号。 若 SQL 中不含 "?",原样返回。

Types

type Kind

type Kind int

Kind 描述 SQL 语句的类别。

const (
	KindUnknown     Kind = iota
	KindSelect           // SELECT / WITH(CTE) / SHOW / DESCRIBE / EXPLAIN
	KindDML              // INSERT / UPDATE / DELETE / MERGE
	KindDDL              // CREATE / ALTER / DROP / TRUNCATE / RENAME
	KindTransaction      // COMMIT / ROLLBACK / SAVEPOINT / SET TRANSACTION
)

func Classify

func Classify(sql string) Kind

Classify 根据 SQL 首关键字判定类别。 会去掉前导空白与 SQL 行注释(-- ...)的简单情况。

func (Kind) IsReadOnly

func (k Kind) IsReadOnly() bool

IsReadOnly 返回该类别是否只读(不会改变数据)。

func (Kind) String

func (k Kind) String() string

String 返回类别的人类可读名。

type PlaceholderStyle

type PlaceholderStyle int

PlaceholderStyle 描述一种数据库驱动的参数占位符风格。

const (
	// StyleQuestion 使用 "?" 占位符(MySQL、ClickHouse)。无需转换。
	StyleQuestion PlaceholderStyle = iota
	// StyleDollar 使用 "$1, $2, ..."(PostgreSQL)。
	StyleDollar
	// StyleColonNumeric 使用 ":1, :2, ..."(Oracle)。
	StyleColonNumeric
)

func PlaceholderStyleFor

func PlaceholderStyleFor(driverType string) PlaceholderStyle

PlaceholderStyleFor 按驱动类型名返回其占位符风格。 未知驱动默认 StyleQuestion(database/sql 的事实标准)。

Jump to

Keyboard shortcuts

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