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 ¶
CountPlaceholders 统计 SQL 中 "?" 占位符的数量,用于校验参数个数是否匹配。
func IsDestructive ¶
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 语句的类别。
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 的事实标准)。