drogonframework / drogon

Drogon: A C++14/17/20 based HTTP web application framework running on Linux/macOS/Unix/Windows
MIT License
11.04k stars 1.06k forks source link

execSqlCoro #1981

Closed AmdRyZen closed 3 months ago

AmdRyZen commented 3 months ago

auto result = co_await clientPtr->execSqlCoro(dynamicSql + " order by id asc limit 10 ", "xxx");

我希望 在 执行 execSqlCoro 方法的时候, Arguments &&...args 参数 是一个 std::vector

不然动态sql 没办法绑定参数 因为where 条件 可能会根据用户参数 拼接的

我尝试写了一个拼接动态sql的方法

Result buildDynamicQuery(const std::string &baseSql, const std::vector &conditions) {

Result result;
result.baseSql = baseSql;

for (const auto &condition : conditions)
{
    result.baseSql += " AND " + condition.field + " " + condition.op + " ?";
    result.params.push_back(condition.value);
}

return result;

}

hwc0919 commented 3 months ago

可以使用SqlBinder接口

https://github.com/drogonframework/drogon/blob/4cbac301fbebb369dba8935f4f727a1ba5b9c513/orm_lib/tests/db_test.cc#L193-L199

然后构造 SqlAwaiter 使用协程

AmdRyZen commented 3 months ago

这种方式 还是不适合 动态sql 正常的逻辑是 比如select 用户提交的body 里面 判断那些参数是否为空 不为空 会拼接一个动态sql 然后 绑定参数 SELECT * FROM xxl_job_info WHERE 1=1 and a=? and b=? 具体有多少个 xxx=? 是不确定的 execSqlCoro 的第一个参数是sql 字符串 后面是动态参数 这种方式只能固定个数

AmdRyZen commented 3 months ago

void YourController::handleHttpRequest(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback) { auto client = drogon::app().getDbClient(); std::vector params;

// 添加参数
int id = 1;
std::string name = "Alice";

// 这里是写死 正常情况是用户是否传id name age 等等 params.push_back(id); params.push_back(name);

auto result = co_await clientPtr->execSqlCoro(dynamicSql + " order by id asc limit 10 ", params);

if (result.error()) {
    // Handle error
    callback(HttpResponse::newHttpError(HttpStatus::k500InternalServerErr));
    return;
}

// Handle success
callback(HttpResponse::newHttpOK());

}

GPT给了一个这种的操作是没办法编译的 不过他的逻辑是我想要的 我的动态sql里面拼接了 几个? params.push_back() 多少个参数 一一对应

hwc0919 commented 3 months ago

用SqlBinder,我给了示例代码