如何在C++ inja模板引擎中实现SQL插入时NULL与字符串的区分处理?
使用inja模板引擎处理SQL插入的NULL值与字符串值区分问题
在生成SQL插入语句时,VARCHAR类型列的字符串值需要用单引号包裹,而SQL NULL值则不需要。用inja模板引擎时,直接固定加单引号会把传入的"NULL"字符串渲染成'NULL',不符合需求;去掉单引号又无法处理正常字符串。
解决方案
可以通过inja的条件判断语法实现动态处理,核心注意两点:
- 若要插入SQL NULL,优先使用
nlohmann::json的null类型,而非字符串"NULL" - 在模板中用条件判断区分值类型,动态决定是否添加单引号
代码实现
- 定义正确的inja模板:
std::string insert_template = R"( INSERT INTO [my_table] (col1) VALUES ( {% if my_value == null %} {{my_value}} {% else %} '{{my_value}}' {% endif %} ); )";
- 处理普通字符串值:
nlohmann::json json_str; json_str["my_value"] = "some_value"; std::string sql_str = inja::render(insert_template, json_str); // 渲染结果:INSERT INTO [my_table] (col1) VALUES ( 'some_value' );
- 处理SQL NULL值:
nlohmann::json json_null; json_null["my_value"] = nullptr; // 使用nlohmann::json原生null类型 std::string sql_null = inja::render(insert_template, json_null); // 渲染结果:INSERT INTO [my_table] (col1) VALUES ( null );
特殊场景兼容
如果业务逻辑必须用字符串"NULL"标识SQL NULL,可修改模板的判断条件:
std::string insert_template = R"( INSERT INTO [my_table] (col1) VALUES ( {% if my_value == "NULL" %} NULL {% else %} '{{my_value}}' {% endif %} ); )";
此时传入json["my_value"] = "NULL";,渲染后会得到INSERT INTO [my_table] (col1) VALUES ( NULL );
内容的提问来源于stack exchange,提问作者Pedro Vicente
相关产品推荐
相关产品推荐

