程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

爆肝之在windows平台使用conan构建drogon+orm

balukai 2025-08-02 17:29:32 文章精选 2 ℃

drogon作为为数不多且性能排名靠前的C++WEB应用框架,不体验下怎么能理解其高明之处呢?

做WEB开发,没有ORM,就相当于上战场没有机关枪,别人哒哒哒,而你pia……pia……pia……,这拉一栓打一枪的效率,可低的不是一星半点,那drogon也同样提供了ORM的功能,可以连接的数据库有mysql、postgresql、sqlite3。

我们看下使用conan包管理器怎么构建drogon+postgresql,同时官方也给了文档Drogon Framework - Documentation

1.在工程根目录下添加conanfile.txt,内容如下:

[requires]
drogon/1.9.10

[options]
drogon/*:with_postgres=True

[generators]
CMakeDeps
CMakeToolchain

[layout]
cmake_layout

注意:这里with_postgres需设置为True,drogon才能开启并连接postgresql。

2.在CMakeLists.txt里添加Drogon依赖:

# 添加 Drogon 依赖
find_package(Drogon)

set(SOURCES 
    controllers/TestCtrl.cc
)

# 创建可执行文件
add_executable(${PROJECT_NAME} main.cpp ${SOURCES})

target_include_directories(${PROJECT_NAME} PRIVATE controllers)

target_link_libraries(${PROJECT_NAME}
    PRIVATE
    Drogon::Drogon
)

注意:这里controllers时默认名称,controller都默认写到这个目录,方便drogon配置读取,省的在单独指定。

3.创建config.json,添加配置,可以到drogon例子里拷贝,重点是listeners、app、db_clients:

 {
    "listeners": [
        {
            "address": "127.0.0.1",
            "port": 8848,
            "https": false
        }
    ],
    "app": {
        "number_of_threads": 1,
        "enable_session": false,
        "session_timeout": 0,
        "session_cookie_key": "JSESSIONID",
        "session_max_age": -1,
        "document_root": "./",
        "home_page": "index.html",
        "use_implicit_page": true,
        "implicit_page": "index.html",
        "upload_path": "uploads",
        "file_types": [
            "gif",
            "png",
            "jpg",
            "js",
            "css",
            "html",
            "ico",
            "swf",
            "xap",
            "apk",
            "cur",
            "xml"
        ],
        "locations": [
            {
                "default_content_type": "text/plain",
                "alias": "",
                "is_case_sensitive": false,
                "allow_all": true,
                "is_recursive": true,
                "filters": []
            }
        ],
        "max_connections": 100000,
        "max_connections_per_ip": 0,
        "load_dynamic_views": false,
        "dynamic_views_path": [
            "./views"
        ],
        "dynamic_views_output_path": "",
        "enable_unicode_escaping_in_json": true,
        "float_precision_in_json": {
            "precision": 0,
            "precision_type": "significant"
        },
        "log": {
            "logfile_base_name": "",
            "log_size_limit": 100000000,
            "log_level": "DEBUG"
        },
        "run_as_daemon": false,
        "handle_sig_term": true,
        "relaunch_on_error": false,
        "use_sendfile": true,
        "use_gzip": true,
        "use_brotli": false,
        "static_files_cache_time": 5,
        "simple_controllers_map": [
        ],
        "idle_connection_timeout": 60,
        "server_header_field": "",
        "enable_server_header": true,
        "enable_date_header": true,
        "keepalive_requests": 0,
        "pipelining_requests": 0,
        "gzip_static": true,
        "br_static": true,
        "client_max_body_size": "1M",
        "client_max_memory_body_size": "64K",
        "client_max_websocket_message_size": "128K",
        "reuse_port": false
    },
    "db_clients":[
        {
        "name":"test",
        "rdbms": "postgresql",
        "host": "127.0.0.1",
        "port": 5432,
        "dbname": "postgres",
        "user": "postgres",
        "passwd": "123456",
        "is_fast": false,
        "connection_number":1,
        "filename": ""
        }
    ]
}

注意:db_clients的name最好设置一下,这里key是不能变的,value随意。

4.测试代码:

#pragma once
#include <drogon/HttpSimpleController.h>
using namespace drogon;

class JsonCtrl : public drogon::HttpSimpleController
{
  public:
    void asyncHandleHttpRequest(
        const HttpRequestPtr &req,
        std::function &&callback) override;
    PATH_LIST_BEGIN
    // list path definitions here;
    PATH_ADD("/json", Get);
    PATH_LIST_END
};

#include "TestCtrl.h"

void JsonCtrl::asyncHandleHttpRequest(
    const HttpRequestPtr &,
    std::function &&callback)
{
    Json::Value ret;
    ret["message"] = "Hello, World!";
    auto clientPtr = drogon::app().getDbClient("test");
    clientPtr->execSqlAsync("select * from users where username=$1",
                            [](const drogon::orm::Result &result) {
                                std::cout << result.size() << " rows selected!" << std::endl;
                                int i = 0;
                                for (auto row : result)
                                {
                                    std::cout << i++ << ": user name is " << row["username"].as() << std::endl;
                                }
                            },
                            [](const drogon::orm::DrogonDbException &e) {
                                std::cerr << "error:" << e.base().what() << std::endl;
                            },
                            "test");
    auto resp = HttpResponse::newHttpJsonResponse(std::move(ret));
    callback(resp);
}

#include 
#include <drogon/drogon.h>

int main(int, char **)
{
    drogon::app().loadConfigFile("config.json");
    drogon::app().run();
    return 0;
}

运行结果:

这样drogon+postgresql就大功告成了,

至于mysql应该是使用一致的方法就行:

1.conanfile.txt文件添加:drogon/*:with_mysql=True。

2.db_clients设置rdbms为mysql,其余详见在线文档Drogon Framework - Documentation

运行后报错如下:

加入root@%后,报错为:


经过多方尝试未能正常解决,所以果断放弃,哪位大佬有成功的方案,还请麻烦不吝赐教,实际场景用mysql还是用postgresql对于体验来说,区别不大。

同样的配置、同样的代码在Linux上运行无异常。

总的来说,约定俗称的配置,现代的编码风格,齐全的框架工具,优异的性能,都很符合现代程序员编写WEB服务的需求,值得一试。

#我的宝藏兴趣#

Tags:

最近发表
标签列表