我想做的是用fmtlib做一个SQL查询构建器,它的理想语法是:
void run_query(fmt::string_view format, fmt::format_args args) {
...
}
template <typename S, typename... Args>
void query(const S& format, Args&&... args) {
run_query(format, fmt::make_args_checked<Args...>(format, args...));
}
std::string query = query("SELECT * FROM user WHERE id = '{}'", 123);
显然,这将允许SQL注入,因此我希望将每个参数传递给一个SQL转义函数。我找到了一个看起来可以工作的previous question,但是库已经改变了,这个例子不再有效。我还查看了一些旧的文档,其中有一个叫做ArgVisitor的东西,我也认为它可能会起作用,但它也被删除了。
我理解在SQL查询构建中使用格式化字符串的想法是有争议的,但我希望保留类型安全性、易用性和编译时的格式化字符串检查。
发布于 2021-10-14 17:15:21
在{fmt} 8.x中,您应该将格式字符串作为fmt::format_string
传递,这将在支持C++20 consteval
的编译器上启用编译时检查
#include <fmt/core.h>
void run_query(fmt::string_view format, fmt::format_args args) {
// ...
}
template <typename... T>
void query(fmt::format_string<T...> fmt, T&&... args) {
run_query(fmt, fmt::make_format_args(args...));
}
int main() {
query("SELECT * FROM user WHERE id = '{}'", 123);
}
https://stackoverflow.com/questions/69559185
复制相似问题