Drogonフレームワークにおけるコントローラー実装とデータベース操作の基礎

DrogonはC++で構築された高速なWebアプリケーションフレームワークです。本記事では、コントローラーの作成方法と、MySQLデータベースへの非同期接続およびクエリ実行の手順を解説します。

1. コントローラーの生成

DrogonのCLIツールであるdrogon_ctlを使用してコントローラーを生成します。以下のコマンドで、指定した名前空間にコントローラークラスを作成可能です。

drogon_ctl create controller api::v1::UserAccount

生成されたヘッダーファイルでは、HttpControllerを継承し、メソッドをルーティングテーブルに登録します。

2. ルーティングの設定

ルーティングには主に2つの方法があります。

  • METHOD_ADD: クラス名やパスを組み合わせた構造的なURLを作成します(例: /api/v1/UserAccount/login)。
  • ADD_METHOD_TO: 任意のパスを直接メソッドに割り当てます(例: /login)。

3. データベースの設定

MySQLを利用する場合、プロジェクトルートのconfig.jsonにデータベース接続情報を記述します。これにより、アプリケーション起動時に接続プールが自動的に構築されます。

{
    "db_clients": [
        {
            "name": "default",
            "rdbms": "mysql",
            "host": "127.0.0.1",
            "port": 3306,
            "dbname": "sample_db",
            "user": "root",
            "passwd": "password",
            "connection_number": 5
        }
    ]
}

4. 非同期SQLクエリの実行

コントローラー内でデータベースにアクセスする際は、drogon::app().getDbClient()を使用してクライアントを取得します。非同期実行(Future)を活用することで、レスポンスまでの待機時間を効率的に管理できます。

#include "UserAccount.h"
#include <drogon/drogon.h>

void UserAccount::getUsers(const HttpRequestPtr &req, std::function<void (const HttpResponsePtr &)> &&callback) const
{
    auto client = drogon::app().getDbClient();
    auto future = client->execSqlAsyncFuture("SELECT id, name FROM users");
    
    try {
        auto result = future.get();
        Json::Value json;
        for (auto const &row : result) {
            Json::Value user;
            user["id"] = row["id"].as<int>();
            user["name"] = row["name"].as<std::string>();
            json.append(user);
        }
        callback(HttpResponse::newHttpJsonResponse(json));
    } catch (const DrogonDbException &e) {
        callback(HttpResponse::newHttpResponse(k500InternalServerError));
    }
}

5. モデルの自動生成時の注意点

drogon_ctl create modelコマンドでデータベーススキーマからエンティティクラスを自動生成できます。注意点として、カラムのデータ型がDECIMAL型やUNSIGNED属性を含む場合、自動生成されたコードで型変換エラーが発生することがあります。モデルファイルを生成・更新した後は、必ずCMakeキャッシュをクリアし、ビルドディレクトリを再構築してください。

タグ: C++ drogon MySQL WebFramework Backend

7月29日 02:43 投稿