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