tag:github.com,2008:https://github.com/rbatis/rbatis/releases
Release notes from rbatis
2026-02-11T06:25:54Z
tag:github.com,2008:Repository/174461456/v4.7.2
2026-02-11T06:29:27Z
v4.7.2
<p>what changes?</p>
<ul>
<li>remove #[html_sql] for mod</li>
<li>add Page support for #[html_sql] for struct<br>
for example:</li>
</ul>
<div class="highlight highlight-source-rust notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="#[rbatis::html_sql("example/example.html")]
impl Activity {
/// Paginated query - automatically detected by return type Page<Activity>
/// Maps to <select id="select_by_page"> in HTML
/// The macro automatically generates pagination logic using PageIntercept
pub async fn select_by_page(
rb: &dyn Executor,
page_req: &dyn PageRequest,
name: &str,
dt: Option<DateTime>,
) -> rbatis::Result<rbatis::Page<Activity>> {
impled!()
}
}"><pre><span class="pl-c1">#<span class="pl-kos">[</span>rbatis<span class="pl-kos">::</span>html_sql<span class="pl-kos">(</span><span class="pl-s">"example/example.html"</span><span class="pl-kos">)</span><span class="pl-kos">]</span></span>
<span class="pl-k">impl</span> <span class="pl-smi">Activity</span> <span class="pl-kos">{</span>
<span class="pl-c">/// Paginated query - automatically detected by return type Page<Activity></span>
<span class="pl-c"></span> <span class="pl-c">/// Maps to <select id="select_by_page"> in HTML</span>
<span class="pl-c"></span> <span class="pl-c">/// The macro automatically generates pagination logic using PageIntercept</span>
<span class="pl-c"></span> <span class="pl-k">pub</span> <span class="pl-k">async</span> <span class="pl-k">fn</span> <span class="pl-en">select_by_page</span><span class="pl-kos">(</span>
<span class="pl-s1">rb</span><span class="pl-kos">:</span> <span class="pl-c1">&</span><span class="pl-k">dyn</span> <span class="pl-smi">Executor</span><span class="pl-kos">,</span>
<span class="pl-s1">page_req</span><span class="pl-kos">:</span> <span class="pl-c1">&</span><span class="pl-k">dyn</span> <span class="pl-smi">PageRequest</span><span class="pl-kos">,</span>
<span class="pl-s1">name</span><span class="pl-kos">:</span> <span class="pl-c1">&</span><span class="pl-smi">str</span><span class="pl-kos">,</span>
<span class="pl-s1">dt</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">DateTime</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-kos">)</span> -> rbatis<span class="pl-kos">::</span><span class="pl-smi">Result</span><span class="pl-kos"><</span>rbatis<span class="pl-kos">::</span><span class="pl-smi">Page</span><span class="pl-kos"><</span><span class="pl-smi">Activity</span><span class="pl-kos">></span><span class="pl-kos">></span> <span class="pl-kos">{</span>
<span class="pl-en">impled</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-kos">)</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span></pre></div>
<div class="highlight highlight-text-html-basic notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="<!-- Paginated query - automatically detected by return type Page<Activity> -->
<select id="select_by_page">
`select * from activity`
<where>
<if test="name != ''">
` and name like #{name}`
</if>
<if test="dt != null">
` and create_time < #{dt}`
</if>
</where>
<!-- PageIntercept will add limit/offset automatically -->
</select>"><pre><span class="pl-c"><!-- Paginated query - automatically detected by return type Page<Activity> --></span>
<span class="pl-kos"><</span><span class="pl-ent">select</span> <span class="pl-c1">id</span>="<span class="pl-s">select_by_page</span>"<span class="pl-kos">></span>
`select * from activity`
<span class="pl-kos"><</span><span class="pl-ent">where</span><span class="pl-kos">></span>
<span class="pl-kos"><</span><span class="pl-ent">if</span> <span class="pl-c1">test</span>="<span class="pl-s">name != ''</span>"<span class="pl-kos">></span>
` and name like #{name}`
<span class="pl-kos"></</span><span class="pl-ent">if</span><span class="pl-kos">></span>
<span class="pl-kos"><</span><span class="pl-ent">if</span> <span class="pl-c1">test</span>="<span class="pl-s">dt != null</span>"<span class="pl-kos">></span>
` and create_time <span class="pl-kos"><</span> #{dt}`
<span class="pl-kos"></</span><span class="pl-ent">if</span><span class="pl-kos">></span>
<span class="pl-kos"></</span><span class="pl-ent">where</span><span class="pl-kos">></span>
<span class="pl-c"><!-- PageIntercept will add limit/offset automatically --></span>
<span class="pl-kos"></</span><span class="pl-ent">select</span><span class="pl-kos">></span></pre></div>
zhuxiujia
tag:github.com,2008:Repository/174461456/v4.7.1
2026-02-06T07:24:56Z
v4.7.1
<p>what changes?</p>
<ul>
<li>merge <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3900199643" data-permission-text="Title is private" data-url="https://github.com/rbatis/rbatis/issues/609" data-hovercard-type="pull_request" data-hovercard-url="/rbatis/rbatis/pull/609/hovercard" href="https://github.com/rbatis/rbatis/pull/609">#609</a> for struct/mod html_sql mapping<br>
for example:</li>
</ul>
<div class="highlight highlight-source-rust notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="use rbatis::dark_std::defer;
use rbatis::executor::Executor;
use rbatis::rbdc::datetime::DateTime;
use rbatis::RBatis;
#[derive(serde::Serialize, serde::Deserialize, Debug)]
pub struct Activity {
pub id: Option<String>,
pub name: Option<String>,
pub pc_link: Option<String>,
pub h5_link: Option<String>,
pub pc_banner_img: Option<String>,
pub h5_banner_img: Option<String>,
pub sort: Option<String>,
pub status: Option<i32>,
pub remark: Option<String>,
pub create_time: Option<DateTime>,
pub version: Option<i64>,
pub delete_flag: Option<i32>,
}
/// All methods read SQL from example/example.html
#[rbatis::html_sql("example/example.html")]
impl Activity {
/// Maps to <select id="select_by_condition"> in HTML
pub async fn select_by_condition(
rb: &dyn Executor,
name: &str,
dt: &DateTime,
) -> rbatis::Result<Vec<Activity>> {
impled!()
}
/// Maps to <select id="select_page_data"> in HTML
pub async fn select_page_data(
rb: &dyn Executor,
name: &str,
dt: &DateTime,
) -> rbatis::Result<Vec<Activity>> {
impled!()
}
/// Maps to <update id="update_by_id"> in HTML
pub async fn update_by_id(
rb: &dyn Executor,
arg: &Activity,
) -> rbatis::Result<rbatis::rbdc::db::ExecResult> {
impled!()
}
}"><pre><span class="pl-k">use</span> rbatis<span class="pl-kos">::</span>dark_std<span class="pl-kos">::</span>defer<span class="pl-kos">;</span>
<span class="pl-k">use</span> rbatis<span class="pl-kos">::</span>executor<span class="pl-kos">::</span><span class="pl-v">Executor</span><span class="pl-kos">;</span>
<span class="pl-k">use</span> rbatis<span class="pl-kos">::</span>rbdc<span class="pl-kos">::</span>datetime<span class="pl-kos">::</span><span class="pl-v">DateTime</span><span class="pl-kos">;</span>
<span class="pl-k">use</span> rbatis<span class="pl-kos">::</span><span class="pl-v">RBatis</span><span class="pl-kos">;</span>
<span class="pl-c1">#<span class="pl-kos">[</span>derive<span class="pl-kos">(</span>serde<span class="pl-kos">::</span><span class="pl-v">Serialize</span><span class="pl-kos">,</span> serde<span class="pl-kos">::</span><span class="pl-v">Deserialize</span><span class="pl-kos">,</span> <span class="pl-v">Debug</span><span class="pl-kos">)</span><span class="pl-kos">]</span></span>
<span class="pl-k">pub</span> <span class="pl-k">struct</span> <span class="pl-smi">Activity</span> <span class="pl-kos">{</span>
<span class="pl-k">pub</span> <span class="pl-c1">id</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">name</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">pc_link</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">h5_link</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">pc_banner_img</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">h5_banner_img</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">sort</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">status</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">i32</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">remark</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">create_time</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">DateTime</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">version</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">i64</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">delete_flag</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">i32</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-kos">}</span>
<span class="pl-c">/// All methods read SQL from example/example.html</span>
<span class="pl-c"></span><span class="pl-c1">#<span class="pl-kos">[</span>rbatis<span class="pl-kos">::</span>html_sql<span class="pl-kos">(</span><span class="pl-s">"example/example.html"</span><span class="pl-kos">)</span><span class="pl-kos">]</span></span>
<span class="pl-k">impl</span> <span class="pl-smi">Activity</span> <span class="pl-kos">{</span>
<span class="pl-c">/// Maps to <select id="select_by_condition"> in HTML</span>
<span class="pl-c"></span> <span class="pl-k">pub</span> <span class="pl-k">async</span> <span class="pl-k">fn</span> <span class="pl-en">select_by_condition</span><span class="pl-kos">(</span>
<span class="pl-s1">rb</span><span class="pl-kos">:</span> <span class="pl-c1">&</span><span class="pl-k">dyn</span> <span class="pl-smi">Executor</span><span class="pl-kos">,</span>
<span class="pl-s1">name</span><span class="pl-kos">:</span> <span class="pl-c1">&</span><span class="pl-smi">str</span><span class="pl-kos">,</span>
<span class="pl-s1">dt</span><span class="pl-kos">:</span> <span class="pl-c1">&</span><span class="pl-smi">DateTime</span><span class="pl-kos">,</span>
<span class="pl-kos">)</span> -> rbatis<span class="pl-kos">::</span><span class="pl-smi">Result</span><span class="pl-kos"><</span><span class="pl-smi">Vec</span><span class="pl-kos"><</span><span class="pl-smi">Activity</span><span class="pl-kos">></span><span class="pl-kos">></span> <span class="pl-kos">{</span>
<span class="pl-en">impled</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-kos">)</span>
<span class="pl-kos">}</span>
<span class="pl-c">/// Maps to <select id="select_page_data"> in HTML</span>
<span class="pl-c"></span> <span class="pl-k">pub</span> <span class="pl-k">async</span> <span class="pl-k">fn</span> <span class="pl-en">select_page_data</span><span class="pl-kos">(</span>
<span class="pl-s1">rb</span><span class="pl-kos">:</span> <span class="pl-c1">&</span><span class="pl-k">dyn</span> <span class="pl-smi">Executor</span><span class="pl-kos">,</span>
<span class="pl-s1">name</span><span class="pl-kos">:</span> <span class="pl-c1">&</span><span class="pl-smi">str</span><span class="pl-kos">,</span>
<span class="pl-s1">dt</span><span class="pl-kos">:</span> <span class="pl-c1">&</span><span class="pl-smi">DateTime</span><span class="pl-kos">,</span>
<span class="pl-kos">)</span> -> rbatis<span class="pl-kos">::</span><span class="pl-smi">Result</span><span class="pl-kos"><</span><span class="pl-smi">Vec</span><span class="pl-kos"><</span><span class="pl-smi">Activity</span><span class="pl-kos">></span><span class="pl-kos">></span> <span class="pl-kos">{</span>
<span class="pl-en">impled</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-kos">)</span>
<span class="pl-kos">}</span>
<span class="pl-c">/// Maps to <update id="update_by_id"> in HTML</span>
<span class="pl-c"></span> <span class="pl-k">pub</span> <span class="pl-k">async</span> <span class="pl-k">fn</span> <span class="pl-en">update_by_id</span><span class="pl-kos">(</span>
<span class="pl-s1">rb</span><span class="pl-kos">:</span> <span class="pl-c1">&</span><span class="pl-k">dyn</span> <span class="pl-smi">Executor</span><span class="pl-kos">,</span>
<span class="pl-s1">arg</span><span class="pl-kos">:</span> <span class="pl-c1">&</span><span class="pl-smi">Activity</span><span class="pl-kos">,</span>
<span class="pl-kos">)</span> -> rbatis<span class="pl-kos">::</span><span class="pl-smi">Result</span><span class="pl-kos"><</span>rbatis<span class="pl-kos">::</span>rbdc<span class="pl-kos">::</span>db<span class="pl-kos">::</span><span class="pl-smi">ExecResult</span><span class="pl-kos">></span> <span class="pl-kos">{</span>
<span class="pl-en">impled</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-kos">)</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span></pre></div>
<div class="highlight highlight-text-html-basic notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"https://raw.githubusercontent.com/rbatis/rbatis/master/rbatis-codegen/mybatis-3-mapper.dtd">
<mapper>
<select id="select_by_condition">
`select * from activity`
<where>
<if test="name != ''">
` and name like #{name}`
</if>
<if test="dt >= '2009-12-12 00:00:00'">
` and create_time < #{dt}`
</if>
<choose>
<when test="true">
` and id != '-1'`
</when>
<otherwise>and id != -2</otherwise>
</choose>
` and `
<trim prefixOverrides=" and">
` and name != '' `
</trim>
</where>
</select>
<select id="select_page_data">
`select * from activity `
<where>
<if test="name != ''">
` and name like #{name}`
</if>
<if test="dt >= '2009-12-12 00:00:00'">
` and create_time < #{dt}`
</if>
<choose>
<when test="true">
` and id != '-1'`
</when>
<otherwise>and id != -2</otherwise>
</choose>
` and `
<trim prefixOverrides=" and">
` and name != '' `
</trim>
</where>
</select>
<update id="update_by_id">
` update activity `
<set collection="arg"></set>
` where id = #{id} `
</update>
</mapper>"><pre><span class="pl-c1"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"</span>
<span class="pl-c1"> "https://raw.githubusercontent.com/rbatis/rbatis/master/rbatis-codegen/mybatis-3-mapper.dtd"<span class="pl-kos">></span></span>
<span class="pl-kos"><</span><span class="pl-ent">mapper</span><span class="pl-kos">></span>
<span class="pl-kos"><</span><span class="pl-ent">select</span> <span class="pl-c1">id</span>="<span class="pl-s">select_by_condition</span>"<span class="pl-kos">></span>
`select * from activity`
<span class="pl-kos"><</span><span class="pl-ent">where</span><span class="pl-kos">></span>
<span class="pl-kos"><</span><span class="pl-ent">if</span> <span class="pl-c1">test</span>="<span class="pl-s">name != ''</span>"<span class="pl-kos">></span>
` and name like #{name}`
<span class="pl-kos"></</span><span class="pl-ent">if</span><span class="pl-kos">></span>
<span class="pl-kos"><</span><span class="pl-ent">if</span> <span class="pl-c1">test</span>="<span class="pl-s">dt >= '2009-12-12 00:00:00'</span>"<span class="pl-kos">></span>
` and create_time <span class="pl-kos"><</span> #{dt}`
<span class="pl-kos"></</span><span class="pl-ent">if</span><span class="pl-kos">></span>
<span class="pl-kos"><</span><span class="pl-ent">choose</span><span class="pl-kos">></span>
<span class="pl-kos"><</span><span class="pl-ent">when</span> <span class="pl-c1">test</span>="<span class="pl-s">true</span>"<span class="pl-kos">></span>
` and id != '-1'`
<span class="pl-kos"></</span><span class="pl-ent">when</span><span class="pl-kos">></span>
<span class="pl-kos"><</span><span class="pl-ent">otherwise</span><span class="pl-kos">></span>and id != -2<span class="pl-kos"></</span><span class="pl-ent">otherwise</span><span class="pl-kos">></span>
<span class="pl-kos"></</span><span class="pl-ent">choose</span><span class="pl-kos">></span>
` and `
<span class="pl-kos"><</span><span class="pl-ent">trim</span> <span class="pl-c1">prefixOverrides</span>="<span class="pl-s"> and</span>"<span class="pl-kos">></span>
` and name != '' `
<span class="pl-kos"></</span><span class="pl-ent">trim</span><span class="pl-kos">></span>
<span class="pl-kos"></</span><span class="pl-ent">where</span><span class="pl-kos">></span>
<span class="pl-kos"></</span><span class="pl-ent">select</span><span class="pl-kos">></span>
<span class="pl-kos"><</span><span class="pl-ent">select</span> <span class="pl-c1">id</span>="<span class="pl-s">select_page_data</span>"<span class="pl-kos">></span>
`select * from activity `
<span class="pl-kos"><</span><span class="pl-ent">where</span><span class="pl-kos">></span>
<span class="pl-kos"><</span><span class="pl-ent">if</span> <span class="pl-c1">test</span>="<span class="pl-s">name != ''</span>"<span class="pl-kos">></span>
` and name like #{name}`
<span class="pl-kos"></</span><span class="pl-ent">if</span><span class="pl-kos">></span>
<span class="pl-kos"><</span><span class="pl-ent">if</span> <span class="pl-c1">test</span>="<span class="pl-s">dt >= '2009-12-12 00:00:00'</span>"<span class="pl-kos">></span>
` and create_time <span class="pl-kos"><</span> #{dt}`
<span class="pl-kos"></</span><span class="pl-ent">if</span><span class="pl-kos">></span>
<span class="pl-kos"><</span><span class="pl-ent">choose</span><span class="pl-kos">></span>
<span class="pl-kos"><</span><span class="pl-ent">when</span> <span class="pl-c1">test</span>="<span class="pl-s">true</span>"<span class="pl-kos">></span>
` and id != '-1'`
<span class="pl-kos"></</span><span class="pl-ent">when</span><span class="pl-kos">></span>
<span class="pl-kos"><</span><span class="pl-ent">otherwise</span><span class="pl-kos">></span>and id != -2<span class="pl-kos"></</span><span class="pl-ent">otherwise</span><span class="pl-kos">></span>
<span class="pl-kos"></</span><span class="pl-ent">choose</span><span class="pl-kos">></span>
` and `
<span class="pl-kos"><</span><span class="pl-ent">trim</span> <span class="pl-c1">prefixOverrides</span>="<span class="pl-s"> and</span>"<span class="pl-kos">></span>
` and name != '' `
<span class="pl-kos"></</span><span class="pl-ent">trim</span><span class="pl-kos">></span>
<span class="pl-kos"></</span><span class="pl-ent">where</span><span class="pl-kos">></span>
<span class="pl-kos"></</span><span class="pl-ent">select</span><span class="pl-kos">></span>
<span class="pl-kos"><</span><span class="pl-ent">update</span> <span class="pl-c1">id</span>="<span class="pl-s">update_by_id</span>"<span class="pl-kos">></span>
` update activity `
<span class="pl-kos"><</span><span class="pl-ent">set</span> <span class="pl-c1">collection</span>="<span class="pl-s">arg</span>"<span class="pl-kos">></span><span class="pl-kos"></</span><span class="pl-ent">set</span><span class="pl-kos">></span>
` where id = #{id} `
<span class="pl-kos"></</span><span class="pl-ent">update</span><span class="pl-kos">></span>
<span class="pl-kos"></</span><span class="pl-ent">mapper</span><span class="pl-kos">></span></pre></div>
zhuxiujia
tag:github.com,2008:Repository/174461456/v4.7.0
2026-01-20T16:29:22Z
v4.7.0
<p>what changes?</p>
<ul>
<li>RBatis Engine All use dyn Trait for example:</li>
</ul>
<div class="highlight highlight-source-rust notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="pub struct RBatis {
// the connection pool
pub pool: Arc<OnceLock<Box<dyn Pool>>>,
// intercept vec(default the intercepts[0] is a log interceptor)
pub intercepts: Arc<SyncVec<Arc<dyn Intercept>>>,
//rb task id gen
pub task_id_generator: Arc<dyn IdGenerator>,
}"><pre><span class="pl-k">pub</span> <span class="pl-k">struct</span> <span class="pl-smi">RBatis</span> <span class="pl-kos">{</span>
<span class="pl-c">// the connection pool</span>
<span class="pl-k">pub</span> <span class="pl-c1">pool</span><span class="pl-kos">:</span> <span class="pl-smi">Arc</span><span class="pl-kos"><</span><span class="pl-smi">OnceLock</span><span class="pl-kos"><</span><span class="pl-smi">Box</span><span class="pl-kos"><</span><span class="pl-k">dyn</span> <span class="pl-smi">Pool</span><span class="pl-kos">></span><span class="pl-kos">></span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-c">// intercept vec(default the intercepts[0] is a log interceptor)</span>
<span class="pl-k">pub</span> <span class="pl-c1">intercepts</span><span class="pl-kos">:</span> <span class="pl-smi">Arc</span><span class="pl-kos"><</span><span class="pl-smi">SyncVec</span><span class="pl-kos"><</span><span class="pl-smi">Arc</span><span class="pl-kos"><</span><span class="pl-k">dyn</span> <span class="pl-smi">Intercept</span><span class="pl-kos">></span><span class="pl-kos">></span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-c">//rb task id gen</span>
<span class="pl-k">pub</span> <span class="pl-c1">task_id_generator</span><span class="pl-kos">:</span> <span class="pl-smi">Arc</span><span class="pl-kos"><</span><span class="pl-k">dyn</span> <span class="pl-smi">IdGenerator</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-kos">}</span></pre></div>
<ul>
<li>performance</li>
</ul>
<div class="highlight highlight-text-md notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="| Optimization Item | Save Time |
|---------------------------------|-----------|
| Avoid `vec![]` allocation | ~50 ns |
| Avoid creating RBAtisKonExecutor| ~100 ns |
| Avoid `task_id` generation | ~11 ns |
| Avoid `Arc` cloning | ~20 ns |
| Reduce function call hierarchy | ~50 ns |
| Empty string fast path | ~30 ns |
| **Total** | **~260 ns** |"><pre><span class="pl-ml">|</span> Optimization Item <span class="pl-ml">|</span> Save Time <span class="pl-ml">|</span>
<span class="pl-ml">|</span>---------------------------------<span class="pl-ml">|</span>-----------<span class="pl-ml">|</span>
<span class="pl-ml">|</span> Avoid <span class="pl-s">`</span><span class="pl-c1">vec![]</span><span class="pl-s">`</span> allocation <span class="pl-ml">|</span> <span class="pl-s">~</span>50 ns <span class="pl-ml">|</span>
<span class="pl-ml">|</span> Avoid creating RBAtisKonExecutor<span class="pl-ml">|</span> <span class="pl-s">~</span>100 ns <span class="pl-ml">|</span>
<span class="pl-ml">|</span> Avoid <span class="pl-s">`</span><span class="pl-c1">task_id</span><span class="pl-s">`</span> generation <span class="pl-ml">|</span> <span class="pl-s">~</span>11 ns <span class="pl-ml">|</span>
<span class="pl-ml">|</span> Avoid <span class="pl-s">`</span><span class="pl-c1">Arc</span><span class="pl-s">`</span> cloning <span class="pl-ml">|</span> <span class="pl-s">~</span>20 ns <span class="pl-ml">|</span>
<span class="pl-ml">|</span> Reduce function call hierarchy <span class="pl-ml">|</span> <span class="pl-s">~</span>50 ns <span class="pl-ml">|</span>
<span class="pl-ml">|</span> Empty string fast path <span class="pl-ml">|</span> <span class="pl-s">~</span>30 ns <span class="pl-ml">|</span>
<span class="pl-ml">|</span> <span class="pl-s">**</span>Total<span class="pl-s">**</span> <span class="pl-ml">|</span> <span class="pl-s">**</span><span class="pl-s">~</span>260 ns<span class="pl-s">**</span> <span class="pl-ml">|</span></pre></div>
<ul>
<li>intercept add Action</li>
</ul>
<div class="highlight highlight-source-rust notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="use rbatis::Error;
use rbatis::executor::Executor;
use rbatis::intercept::{Intercept, ResultType};
use rbdc::db::ExecResult;
use rbs::Value;
use rbatis::Action;
#[derive(Debug)]
pub struct ReturningIdPlugin{}
#[rbatis::async_trait]
impl Intercept for ReturningIdPlugin {
async fn before(
&self,
_task_id: i64,
rb: &dyn Executor,
sql: &mut String,
args: &mut Vec<Value>,
result: ResultType<&mut Result<ExecResult, Error>, &mut Result<Value, Error>>,
) -> Result<Action, Error> {
Ok(Action::Next)
}
}"><pre><span class="pl-k">use</span> rbatis<span class="pl-kos">::</span><span class="pl-v">Error</span><span class="pl-kos">;</span>
<span class="pl-k">use</span> rbatis<span class="pl-kos">::</span>executor<span class="pl-kos">::</span><span class="pl-v">Executor</span><span class="pl-kos">;</span>
<span class="pl-k">use</span> rbatis<span class="pl-kos">::</span>intercept<span class="pl-kos">::</span><span class="pl-kos">{</span><span class="pl-v">Intercept</span><span class="pl-kos">,</span> <span class="pl-v">ResultType</span><span class="pl-kos">}</span><span class="pl-kos">;</span>
<span class="pl-k">use</span> rbdc<span class="pl-kos">::</span>db<span class="pl-kos">::</span><span class="pl-v">ExecResult</span><span class="pl-kos">;</span>
<span class="pl-k">use</span> rbs<span class="pl-kos">::</span><span class="pl-v">Value</span><span class="pl-kos">;</span>
<span class="pl-k">use</span> rbatis<span class="pl-kos">::</span><span class="pl-v">Action</span><span class="pl-kos">;</span>
<span class="pl-c1">#<span class="pl-kos">[</span>derive<span class="pl-kos">(</span><span class="pl-v">Debug</span><span class="pl-kos">)</span><span class="pl-kos">]</span></span>
<span class="pl-k">pub</span> <span class="pl-k">struct</span> <span class="pl-smi">ReturningIdPlugin</span><span class="pl-kos">{</span><span class="pl-kos">}</span>
<span class="pl-c1">#<span class="pl-kos">[</span>rbatis<span class="pl-kos">::</span>async_trait<span class="pl-kos">]</span></span>
<span class="pl-k">impl</span> <span class="pl-smi">Intercept</span> <span class="pl-k">for</span> <span class="pl-smi">ReturningIdPlugin</span> <span class="pl-kos">{</span>
<span class="pl-k">async</span> <span class="pl-k">fn</span> <span class="pl-en">before</span><span class="pl-kos">(</span>
<span class="pl-c1">&</span><span class="pl-smi">self</span><span class="pl-kos">,</span>
<span class="pl-s1">_task_id</span><span class="pl-kos">:</span> <span class="pl-smi">i64</span><span class="pl-kos">,</span>
<span class="pl-s1">rb</span><span class="pl-kos">:</span> <span class="pl-c1">&</span><span class="pl-k">dyn</span> <span class="pl-smi">Executor</span><span class="pl-kos">,</span>
<span class="pl-s1">sql</span><span class="pl-kos">:</span> <span class="pl-c1">&</span><span class="pl-k">mut</span> <span class="pl-smi">String</span><span class="pl-kos">,</span>
<span class="pl-s1">args</span><span class="pl-kos">:</span> <span class="pl-c1">&</span><span class="pl-k">mut</span> <span class="pl-smi">Vec</span><span class="pl-kos"><</span><span class="pl-smi">Value</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-s1">result</span><span class="pl-kos">:</span> <span class="pl-smi">ResultType</span><span class="pl-kos"><</span><span class="pl-c1">&</span><span class="pl-k">mut</span> <span class="pl-smi">Result</span><span class="pl-kos"><</span><span class="pl-smi">ExecResult</span><span class="pl-kos">,</span> <span class="pl-smi">Error</span><span class="pl-kos">></span><span class="pl-kos">,</span> <span class="pl-c1">&</span><span class="pl-k">mut</span> <span class="pl-smi">Result</span><span class="pl-kos"><</span><span class="pl-smi">Value</span><span class="pl-kos">,</span> <span class="pl-smi">Error</span><span class="pl-kos">></span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-kos">)</span> -> <span class="pl-smi">Result</span><span class="pl-kos"><</span><span class="pl-smi">Action</span><span class="pl-kos">,</span> <span class="pl-smi">Error</span><span class="pl-kos">></span> <span class="pl-kos">{</span>
<span class="pl-en">Ok</span><span class="pl-kos">(</span><span class="pl-smi">Action</span><span class="pl-kos">::</span><span class="pl-v">Next</span><span class="pl-kos">)</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span></pre></div>
zhuxiujia
tag:github.com,2008:Repository/174461456/v4.6.15
2026-01-04T17:51:41Z
v4.6.15
<ul>
<li>up rbdc version</li>
</ul>
zhuxiujia
tag:github.com,2008:Repository/174461456/v4.6.14
2025-12-27T11:37:23Z
v4.6.14
<ul>
<li>Simplify implementation for intercept</li>
</ul>
zhuxiujia
tag:github.com,2008:Repository/174461456/v4.6.13
2025-12-03T03:36:12Z
v4.6.13
<p>what changes?</p>
<ul>
<li>Support for temporarily replacing the interceptor list<br>
for example:</li>
</ul>
<div class="highlight highlight-source-rust notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
/// Mock intercept that just prints SQL
#[derive(Debug)]
pub struct MockIntercept;
#[async_trait]
impl Intercept for MockIntercept {
async fn before(
&self,
task_id: i64,
_rb: &dyn Executor,
sql: &mut String,
_args: &mut Vec<Value>,
_result: ResultType<&mut Result<ExecResult, rbatis::Error>, &mut Result<Vec<Value>, rbatis::Error>>,
) -> Result<Option<bool>, rbatis::Error> {
*sql = sql.replace("<my_table_name>", &format!("activity_{}",task_id % 2));
println!("MockIntercept: SQL = {}", sql);
Ok(Some(true))
}
}
#[tokio::main]
pub async fn main() -> Result<(), rbatis::Error> {
_ = fast_log::init(fast_log::Config::new().console());
let rb = RBatis::new();
rb.init(rbdc_sqlite::driver::SqliteDriver {}, "sqlite://target/sqlite.db")?;
// create table
_=rb.exec("CREATE TABLE activity_0 ( id INTEGER PRIMARY KEY);", vec![]).await;
_=rb.exec("CREATE TABLE activity_1 ( id INTEGER PRIMARY KEY);", vec![]).await;
let len = rb.intercepts.len();
println!("len={}", len);
// Create new intercept list and add our mock intercept
let new_intercept = Arc::new(SyncVec::new());
let intercept: Arc<dyn Intercept> = Arc::new(MockIntercept {});
new_intercept.push(intercept);
// Create connection and replace its intercepts
let mut conn = rb.acquire().await?;
conn.intercepts = new_intercept;
println!("conn.intercepts.len={}", conn.intercepts.len());
// Execute query to see the mock intercept in action
let _ = conn.query("SELECT <my_table_name>", vec![]).await;
let data = Activity::select_all(&conn).await?;
println!("data={:?}", json!(data));
Ok(())
}
/// table
#[derive(serde::Serialize, serde::Deserialize, Clone)]
pub struct Activity {
pub id: Option<String>,
pub name: Option<String>,
pub pc_link: Option<String>,
pub h5_link: Option<String>,
pub pc_banner_img: Option<String>,
pub h5_banner_img: Option<String>,
pub sort: Option<String>,
pub status: Option<i32>,
pub remark: Option<String>,
pub create_time: Option<DateTime>,
pub version: Option<i64>,
pub delete_flag: Option<i32>,
}
//crud!(Activity {},"activity");
crud!(Activity {},"<my_table_name>");"><pre><span class="pl-c">/// Mock intercept that just prints SQL</span>
<span class="pl-c"></span><span class="pl-c1">#<span class="pl-kos">[</span>derive<span class="pl-kos">(</span><span class="pl-v">Debug</span><span class="pl-kos">)</span><span class="pl-kos">]</span></span>
<span class="pl-k">pub</span> <span class="pl-k">struct</span> <span class="pl-smi">MockIntercept</span><span class="pl-kos">;</span>
<span class="pl-c1">#<span class="pl-kos">[</span>async_trait<span class="pl-kos">]</span></span>
<span class="pl-k">impl</span> <span class="pl-smi">Intercept</span> <span class="pl-k">for</span> <span class="pl-smi">MockIntercept</span> <span class="pl-kos">{</span>
<span class="pl-k">async</span> <span class="pl-k">fn</span> <span class="pl-en">before</span><span class="pl-kos">(</span>
<span class="pl-c1">&</span><span class="pl-smi">self</span><span class="pl-kos">,</span>
<span class="pl-s1">task_id</span><span class="pl-kos">:</span> <span class="pl-smi">i64</span><span class="pl-kos">,</span>
<span class="pl-s1">_rb</span><span class="pl-kos">:</span> <span class="pl-c1">&</span><span class="pl-k">dyn</span> <span class="pl-smi">Executor</span><span class="pl-kos">,</span>
<span class="pl-s1">sql</span><span class="pl-kos">:</span> <span class="pl-c1">&</span><span class="pl-k">mut</span> <span class="pl-smi">String</span><span class="pl-kos">,</span>
<span class="pl-s1">_args</span><span class="pl-kos">:</span> <span class="pl-c1">&</span><span class="pl-k">mut</span> <span class="pl-smi">Vec</span><span class="pl-kos"><</span><span class="pl-smi">Value</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-s1">_result</span><span class="pl-kos">:</span> <span class="pl-smi">ResultType</span><span class="pl-kos"><</span><span class="pl-c1">&</span><span class="pl-k">mut</span> <span class="pl-smi">Result</span><span class="pl-kos"><</span><span class="pl-smi">ExecResult</span><span class="pl-kos">,</span> rbatis<span class="pl-kos">::</span><span class="pl-smi">Error</span><span class="pl-kos">></span><span class="pl-kos">,</span> <span class="pl-c1">&</span><span class="pl-k">mut</span> <span class="pl-smi">Result</span><span class="pl-kos"><</span><span class="pl-smi">Vec</span><span class="pl-kos"><</span><span class="pl-smi">Value</span><span class="pl-kos">></span><span class="pl-kos">,</span> rbatis<span class="pl-kos">::</span><span class="pl-smi">Error</span><span class="pl-kos">></span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-kos">)</span> -> <span class="pl-smi">Result</span><span class="pl-kos"><</span><span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">bool</span><span class="pl-kos">></span><span class="pl-kos">,</span> rbatis<span class="pl-kos">::</span><span class="pl-smi">Error</span><span class="pl-kos">></span> <span class="pl-kos">{</span>
<span class="pl-c1">*</span>sql = sql<span class="pl-kos">.</span><span class="pl-en">replace</span><span class="pl-kos">(</span><span class="pl-s">"<my_table_name>"</span><span class="pl-kos">,</span> <span class="pl-c1">&</span><span class="pl-en">format</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-s">"activity_{}"</span><span class="pl-kos">,</span>task_id % <span class="pl-c1">2</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-en">println</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-s">"MockIntercept: SQL = {}"</span><span class="pl-kos">,</span> sql<span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-en">Ok</span><span class="pl-kos">(</span><span class="pl-en">Some</span><span class="pl-kos">(</span><span class="pl-c1">true</span><span class="pl-kos">)</span><span class="pl-kos">)</span>
<span class="pl-kos">}</span>
<span class="pl-kos">}</span>
<span class="pl-c1">#<span class="pl-kos">[</span>tokio<span class="pl-kos">::</span>main<span class="pl-kos">]</span></span>
<span class="pl-k">pub</span> <span class="pl-k">async</span> <span class="pl-k">fn</span> <span class="pl-en">main</span><span class="pl-kos">(</span><span class="pl-kos">)</span> -> <span class="pl-smi">Result</span><span class="pl-kos"><</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">,</span> rbatis<span class="pl-kos">::</span><span class="pl-smi">Error</span><span class="pl-kos">></span> <span class="pl-kos">{</span>
_ = fast_log<span class="pl-kos">::</span><span class="pl-en">init</span><span class="pl-kos">(</span>fast_log<span class="pl-kos">::</span><span class="pl-smi">Config</span><span class="pl-kos">::</span><span class="pl-en">new</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">console</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">let</span> rb = <span class="pl-smi">RBatis</span><span class="pl-kos">::</span><span class="pl-en">new</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
rb<span class="pl-kos">.</span><span class="pl-en">init</span><span class="pl-kos">(</span>rbdc_sqlite<span class="pl-kos">::</span>driver<span class="pl-kos">::</span><span class="pl-smi">SqliteDriver</span> <span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-s">"sqlite://target/sqlite.db"</span><span class="pl-kos">)</span>?<span class="pl-kos">;</span>
<span class="pl-c">// create table</span>
_=rb<span class="pl-kos">.</span><span class="pl-en">exec</span><span class="pl-kos">(</span><span class="pl-s">"CREATE TABLE activity_0 ( id INTEGER PRIMARY KEY);"</span><span class="pl-kos">,</span> <span class="pl-en">vec</span><span class="pl-en">!</span><span class="pl-kos">[</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-k">await</span><span class="pl-kos">;</span>
_=rb<span class="pl-kos">.</span><span class="pl-en">exec</span><span class="pl-kos">(</span><span class="pl-s">"CREATE TABLE activity_1 ( id INTEGER PRIMARY KEY);"</span><span class="pl-kos">,</span> <span class="pl-en">vec</span><span class="pl-en">!</span><span class="pl-kos">[</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-k">await</span><span class="pl-kos">;</span>
<span class="pl-k">let</span> len = rb<span class="pl-kos">.</span><span class="pl-c1">intercepts</span><span class="pl-kos">.</span><span class="pl-en">len</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-en">println</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-s">"len={}"</span><span class="pl-kos">,</span> len<span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-c">// Create new intercept list and add our mock intercept</span>
<span class="pl-k">let</span> new_intercept = <span class="pl-smi">Arc</span><span class="pl-kos">::</span><span class="pl-en">new</span><span class="pl-kos">(</span><span class="pl-smi">SyncVec</span><span class="pl-kos">::</span><span class="pl-en">new</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">let</span> intercept<span class="pl-kos">:</span> <span class="pl-smi">Arc</span><span class="pl-kos"><</span><span class="pl-k">dyn</span> <span class="pl-smi">Intercept</span><span class="pl-kos">></span> = <span class="pl-smi">Arc</span><span class="pl-kos">::</span><span class="pl-en">new</span><span class="pl-kos">(</span><span class="pl-smi">MockIntercept</span> <span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
new_intercept<span class="pl-kos">.</span><span class="pl-en">push</span><span class="pl-kos">(</span>intercept<span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-c">// Create connection and replace its intercepts</span>
<span class="pl-k">let</span> <span class="pl-k">mut</span> conn = rb<span class="pl-kos">.</span><span class="pl-en">acquire</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-k">await</span>?<span class="pl-kos">;</span>
conn<span class="pl-kos">.</span><span class="pl-c1">intercepts</span> = new_intercept<span class="pl-kos">;</span>
<span class="pl-en">println</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-s">"conn.intercepts.len={}"</span><span class="pl-kos">,</span> conn<span class="pl-kos">.</span>intercepts<span class="pl-kos">.</span>len<span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-c">// Execute query to see the mock intercept in action</span>
<span class="pl-k">let</span> _ = conn<span class="pl-kos">.</span><span class="pl-en">query</span><span class="pl-kos">(</span><span class="pl-s">"SELECT <my_table_name>"</span><span class="pl-kos">,</span> <span class="pl-en">vec</span><span class="pl-en">!</span><span class="pl-kos">[</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-k">await</span><span class="pl-kos">;</span>
<span class="pl-k">let</span> data = <span class="pl-smi">Activity</span><span class="pl-kos">::</span><span class="pl-en">select_all</span><span class="pl-kos">(</span><span class="pl-c1">&</span>conn<span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-k">await</span>?<span class="pl-kos">;</span>
<span class="pl-en">println</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-s">"data={:?}"</span><span class="pl-kos">,</span> json!<span class="pl-kos">(</span>data<span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-en">Ok</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span>
<span class="pl-kos">}</span>
<span class="pl-c">/// table</span>
<span class="pl-c"></span><span class="pl-c1">#<span class="pl-kos">[</span>derive<span class="pl-kos">(</span>serde<span class="pl-kos">::</span><span class="pl-v">Serialize</span><span class="pl-kos">,</span> serde<span class="pl-kos">::</span><span class="pl-v">Deserialize</span><span class="pl-kos">,</span> <span class="pl-v">Clone</span><span class="pl-kos">)</span><span class="pl-kos">]</span></span>
<span class="pl-k">pub</span> <span class="pl-k">struct</span> <span class="pl-smi">Activity</span> <span class="pl-kos">{</span>
<span class="pl-k">pub</span> <span class="pl-c1">id</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">name</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">pc_link</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">h5_link</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">pc_banner_img</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">h5_banner_img</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">sort</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">status</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">i32</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">remark</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">create_time</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">DateTime</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">version</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">i64</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">delete_flag</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">i32</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-kos">}</span>
<span class="pl-c">//crud!(Activity {},"activity");</span>
<span class="pl-en">crud</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-v">Activity</span> <span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">,</span><span class="pl-s">"<my_table_name>"</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div>
zhuxiujia
tag:github.com,2008:Repository/174461456/v4.6.12
2025-10-12T14:33:01Z
v4.6.12
<p>what changes?</p>
<ul>
<li>impl <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3316863428" data-permission-text="Title is private" data-url="https://github.com/rbatis/rbatis/issues/591" data-hovercard-type="issue" data-hovercard-url="/rbatis/rbatis/issues/591/hovercard" href="https://github.com/rbatis/rbatis/issues/591">#591</a> for</li>
</ul>
<div class="highlight highlight-source-rust notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content=" #[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq)]
struct MockTable {
pub id: Option<String>,
pub name: Option<String>,
pub status: Option<i32>
}
crud!(MockTable{});
let r = MockTable::update_by_map(rb, &table, value!{"id":"1", "column": ["name", "status"]}).await;"><pre> <span class="pl-c1">#<span class="pl-kos">[</span>derive<span class="pl-kos">(</span><span class="pl-v">Clone</span><span class="pl-kos">,</span> <span class="pl-v">Debug</span><span class="pl-kos">,</span> serde<span class="pl-kos">::</span><span class="pl-v">Serialize</span><span class="pl-kos">,</span> serde<span class="pl-kos">::</span><span class="pl-v">Deserialize</span><span class="pl-kos">,</span> <span class="pl-v">PartialEq</span><span class="pl-kos">)</span><span class="pl-kos">]</span></span>
<span class="pl-k">struct</span> <span class="pl-smi">MockTable</span> <span class="pl-kos">{</span>
<span class="pl-k">pub</span> <span class="pl-c1">id</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">name</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">status</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">i32</span><span class="pl-kos">></span>
<span class="pl-kos">}</span>
<span class="pl-en">crud</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-v">MockTable</span><span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">let</span> r = <span class="pl-smi">MockTable</span><span class="pl-kos">::</span><span class="pl-en">update_by_map</span><span class="pl-kos">(</span>rb<span class="pl-kos">,</span> <span class="pl-c1">&</span>table<span class="pl-kos">,</span> <span class="pl-en">value</span><span class="pl-en">!</span><span class="pl-kos">{</span><span class="pl-s">"id"</span><span class="pl-kos">:</span><span class="pl-s">"1"</span><span class="pl-kos">,</span> <span class="pl-s">"column"</span><span class="pl-kos">:</span> <span class="pl-kos">[</span><span class="pl-s">"name"</span><span class="pl-kos">,</span> <span class="pl-s">"status"</span><span class="pl-kos">]</span><span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-k">await</span><span class="pl-kos">;</span></pre></div>
<ul>
<li>impl <code>crud!</code> for select target columns</li>
</ul>
<div class="highlight highlight-source-rust notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content=" #[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq)]
struct MockTable {
pub id: Option<String>,
pub name: Option<String>,
pub status: Option<i32>
}
crud!(MockTable{});
let tables = MockTable::select_by_map(rb,value!{"id":"1", "column": ["id", "name"]}).await?; "><pre> <span class="pl-c1">#<span class="pl-kos">[</span>derive<span class="pl-kos">(</span><span class="pl-v">Clone</span><span class="pl-kos">,</span> <span class="pl-v">Debug</span><span class="pl-kos">,</span> serde<span class="pl-kos">::</span><span class="pl-v">Serialize</span><span class="pl-kos">,</span> serde<span class="pl-kos">::</span><span class="pl-v">Deserialize</span><span class="pl-kos">,</span> <span class="pl-v">PartialEq</span><span class="pl-kos">)</span><span class="pl-kos">]</span></span>
<span class="pl-k">struct</span> <span class="pl-smi">MockTable</span> <span class="pl-kos">{</span>
<span class="pl-k">pub</span> <span class="pl-c1">id</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">name</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">String</span><span class="pl-kos">></span><span class="pl-kos">,</span>
<span class="pl-k">pub</span> <span class="pl-c1">status</span><span class="pl-kos">:</span> <span class="pl-smi">Option</span><span class="pl-kos"><</span><span class="pl-smi">i32</span><span class="pl-kos">></span>
<span class="pl-kos">}</span>
<span class="pl-en">crud</span><span class="pl-en">!</span><span class="pl-kos">(</span><span class="pl-v">MockTable</span><span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">let</span> tables = <span class="pl-smi">MockTable</span><span class="pl-kos">::</span><span class="pl-en">select_by_map</span><span class="pl-kos">(</span>rb<span class="pl-kos">,</span><span class="pl-en">value</span><span class="pl-en">!</span><span class="pl-kos">{</span><span class="pl-s">"id"</span><span class="pl-kos">:</span><span class="pl-s">"1"</span><span class="pl-kos">,</span> <span class="pl-s">"column"</span><span class="pl-kos">:</span> <span class="pl-kos">[</span><span class="pl-s">"id"</span><span class="pl-kos">,</span> <span class="pl-s">"name"</span><span class="pl-kos">]</span><span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-k">await</span>?<span class="pl-kos">;</span> </pre></div>
zhuxiujia
tag:github.com,2008:Repository/174461456/v4.6.11
2025-10-12T12:59:32Z
v4.6.11
<p>fix+1</p>
zhuxiujia
tag:github.com,2008:Repository/174461456/v4.6.10
2025-10-12T12:45:32Z
v4.6.10
<p>fix test</p>
zhuxiujia
tag:github.com,2008:Repository/174461456/v4.6.9
2025-10-11T17:48:53Z
v4.6.9
<ul>
<li>this is an doc fix version</li>
<li>merge <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="3242586448" data-permission-text="Title is private" data-url="https://github.com/rbatis/rbatis/issues/586" data-hovercard-type="pull_request" data-hovercard-url="/rbatis/rbatis/pull/586/hovercard" href="https://github.com/rbatis/rbatis/pull/586">#586</a></li>
</ul>
zhuxiujia