Expand description
XML/py_sql 动态 SQL 构造器(rbatis 风格)
rbatis 的核心特性是 XML 风格的动态 SQL 模板:
<select>/<insert>/<update>/<delete>顶层语句<if test="...">条件块<where>自动处理首个 AND/OR<set>UPDATE 语句的 SET 子句<foreach>循环展开(用于 IN 子句)<choose><when><otherwise>多分支选择<trim>通用前后缀修剪#{name}命名参数绑定
§用法
ⓘ
use sz_orm_query::dynamic_sql::{DynamicSqlParser, SqlParams};
use std::collections::HashMap;
let xml = r#"
<select id="find_users">
SELECT * FROM users
<where>
<if test="name != null">AND name = #{name}</if>
<if test="age != null">AND age > #{age}</if>
</where>
</select>
"#;
let parser = DynamicSqlParser::from_xml(xml);
let mut params = SqlParams::new();
params.set("name", "Alice");
// params.set("age", 18); // 不设置则 if 不生效
let sql = parser.build("find_users", ¶ms).unwrap();
// SELECT * FROM users WHERE name = ?§支持的标签
| 标签 | 作用 |
|---|---|
<select id> | SELECT 语句容器 |
<insert id> | INSERT 语句容器 |
<update id> | UPDATE 语句容器 |
<delete id> | DELETE 语句容器 |
<if test="expr"> | 条件包含 |
<where> | WHERE 子句(自动处理首个 AND/OR) |
<set> | SET 子句(自动处理末尾逗号) |
<foreach collection="x" item="i" separator=","> | 循环展开 |
<choose> / <when> / <otherwise> | 多分支选择 |
<trim prefix="..." suffix="..." prefixOverrides="AND"> | 通用修剪 |
#{name} | 命名参数绑定 |
${name} | 字符串插值(注意 SQL 注入风险) |
§安全警告
${name} 字符串插值存在 SQL 注入风险,即使已添加基础转义。
强烈推荐使用 #{name} 命名参数绑定,仅在 SQL 结构动态(如表名/列名)时
才使用 ${name},且必须确保输入来源可信。
Structs§
- Dynamic
SqlParser - 动态 SQL 解析器
- SqlParams
- SQL 参数容器
- XmlNode
Enums§
- Dynamic
SqlError - 动态 SQL 错误
- Param
Value - 参数值
- XmlNode
Type