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キャッシュをクリアし、ビルドディレクトリを再構築してください。