在 C++ 模板引擎库 inja 中检测字符串值的条件(用于 SQL 插入 NULL)

condition for detecting string value in C++ template engine library inja (for SQL insertion of NULL)

提问人:Pedro Vicente 提问时间:7/24/2022 最后编辑:Pedro Vicente 更新时间:7/28/2022 访问量:201

问:

使用 C++ 模板引擎库

https://github.com/pantor/inja

在 SQL 中,我可以在数据库中插入一行,其中包含名为“col1”的 VARCHAR SQL 类型列

std::string my_template = "INSERT INTO [my_table] (col1) VALUES ('my_value');"

请注意,SQL VARCHAR 类型需要单引号

“my_value”

若要插入 SQL NULL 值,则不指定单引号

"INSERT INTO [my_table] (col1) VALUES (NULL);"

我有一个模板,其中的值是单引号的,它允许插入字符串值,例如

std::string insert_template =
"INSERT INTO [my_table] (col1) VALUES ( '{{my_value}}' )";

nlohmann::json json;
json["my_value"] = "some_value";
std::string sql = inja::render(insert_template, json);

调用模板,并暂定插入 SQL NULL 作为

nlohmann::json json;
json["my_value"] = "NULL";

不正确,因为字符串是单引号的,导致 SQL 插入 将“NULL”作为 4 个字符的字符串,而不是 SQL NULL 值

问题

我怎样才能创建一个条件来检测参数是否 '{{my_value}}' )

如果值为“NULL”,则是否应该单引号?

将模板定义为(非单引号)

std::string insert_template =
"INSERT INTO [my_table] (col1) VALUES ( {{my_value}} )";

适用于 NULL 值,但不适用于字符串

所以,我想要类似的东西(在伪 INJA 语法中)

std::string insert_template =
"INSERT INTO [my_table] (col1) VALUES ( 
{% if my_value == NULL %}
{{my_value}} 
{% else %}
'{{my_value}}'
{% endif %}
 )";

这有可能以某种方式实现吗?

C++ SQL null 模板引擎

评论

0赞 lorro 7/24/2022
我不会做这样的特例,因为那样你就无法搜索这个四个字符的字符串。相反,我建议用它来表示可空性并编写一个快速包装器(如果它还没有提供它)。"NULL"std::optional<std::string>inja::render()

答:

0赞 Pedro Vicente 7/28/2022 #1

模板中的此构造根据值为“NULL”选择是否引用版本

nlohmann::json json4;
  json4["name"] = "NULL";
  std::string template5 = "INSERT INTO [my_table] (col1) VALUES ( \
  {%if name == \"NULL\"%}\
  {{name}}\
  {%else%}\
  '{{name}}'\
  {%endif%}\
  )";

  std::string rendered5 = inja::render(template5, json4);
  std::cout << rendered5 << std::endl;

呈现的字符串是

INSERT INTO [my_table] (col1) VALUES (     NULL    )