d-bye

Rust(actix-web)の CRUD API をスキーマから自動生成する

テーブルの列を定義すると、d-bye は actix-web の CRUD REST API を Rust で生成します。型付きの構造体・ハンドラ・入力バリデーション・外部キー整合を含みます。API 単体ではなく、フロント(React)と PostgreSQL の DDL まで同じ設計書から横断一貫で生成され、ZIP で全文エクスポートできます。

actix-web の CRUD 生成とは

actix-web は Rust の高速な Web フレームワークです。CRUD API は、あるテーブルに対して作成・取得・更新・削除を行う REST エンドポイント群で、どのテーブルでも似た形になるためスキーマから自動生成するのに向いています。

d-bye は「設計書を起点」として、テーブル・列・制約・外部キーを定義すると、そこから actix-web のハンドラと型付き構造体を生成します。AI は生コードではなく設計書を書き、その後に型検証+コンパイルチェックを通すため、コンパイルの通らない Rust を出しません。

言語を問わず生成したい場合は「CRUD API の生成(Rust/Node 切替)」を、DB スキーマから始めたい場合は「テーブル定義書のテンプレートと書き方」も参照してください。

生成される actix API に含まれるもの

テーブルごとに、最低限これらがまとめて生成されます。

GET /(一覧)
ページング・並び替え対応の一覧取得ハンドラ。
GET /{id}(単体)
主キーによる 1 件取得。
POST /(作成)
serde でデシリアライズ+バリデーション付きの作成。
PUT/PATCH /{id}(更新)
部分更新・全更新。
DELETE /{id}(削除)
削除(必要なら論理削除に切替可)。
型付き構造体 / FK 整合
テーブルに対応する Rust 構造体、型・必須・外部キー参照の整合。

まずはスキーマを定義(コピーして使えるひな形)

下は「商品(products)」テーブルの例です。コピーして自分のテーブルに書き換え、d-bye で同じ内容をビジュアルに作ると、この定義から下のような actix-web の CRUD が生成されます。

template
| 論理名 | 物理名 | データ型 | 主キー | NOT NULL | 説明 |
|--------|--------|----------|:------:|:--------:|------|
| ID | id | uuid | ○ | ○ | 主キー |
| 商品名 | name | varchar(120) |  | ○ | 必須 |
| SKU | sku | varchar(40) |  | ○ | ユニーク |
| 単価 | price | numeric(10,2) |  | ○ | 0 以上 |
| 仕入先 | supplier_id | uuid(FK) |  | ○ | suppliers を参照 |

actix-web CRUD を生成する手順

  1. テーブルと列(型・NOT NULL・既定値・FK)を定義する。
  2. バックエンドのスタックを Rust(actix-web)にする。
  3. CRUD API を設計書から生成する。
  4. プレビュー/生成コードでエンドポイントの挙動を確認する。
  5. コードを生成し、ZIP でエクスポートする。
  6. cargo で自社環境にデプロイ、手で拡張する。

d-bye なら:定義から actix-web の CRUD が“動く形”で出る

上の products 定義をビジュアルに作ると、CRUD の一部はおおよそ次のような Rust コードとして生成されます(actix-web + sqlx の抜粋)。

生成される Rust コード(例・抜粋)
// products.rs — generated by d-bye (actix-web + sqlx, excerpt)
#[get("/products")]
async fn list(db: web::Data<PgPool>) -> Result<HttpResponse, ApiError> {
    let rows = sqlx::query_as::<_, Product>(
        "SELECT * FROM products ORDER BY created_at DESC",
    )
    .fetch_all(db.get_ref())
    .await?;
    Ok(HttpResponse::Ok().json(rows))
}

#[post("/products")]
async fn create(
    db: web::Data<PgPool>,
    body: web::Json<ProductInput>,
) -> Result<HttpResponse, ApiError> {
    let p = body.into_inner();
    let row = sqlx::query_as::<_, Product>(
        "INSERT INTO products (name, sku, price, supplier_id) \
         VALUES ($1, $2, $3, $4) RETURNING *",
    )
    .bind(&p.name).bind(&p.sku).bind(p.price).bind(p.supplier_id)
    .fetch_one(db.get_ref())
    .await?;
    Ok(HttpResponse::Created().json(row))
}
  • API だけでなく、フロント(React)の CRUD 画面と PostgreSQL DDL まで一括生成。
  • すべて同じ設計書から導かれるので、API・UI・DB がスタック横断で一致する。
  • 型検証+コンパイルチェックを通すので、コンパイルの通らない Rust を出さない。
  • 生成物は ZIP で全文エクスポート。自社インフラで起動でき、ロックインがない。

よくある質問

PostgreSQL スキーマから actix-web の CRUD を生成できますか?
はい。テーブルと列(型・制約・外部キー)を定義すると、actix-web の CRUD ハンドラと型付き構造体を Rust で生成します。同じ設計書からフロントと PostgreSQL DDL も生成されます。
Node.js との切り替えはできますか?
できます。バックエンドは Rust(actix-web) と Node.js(Express) を切り替えられます。汎用の解説は「CRUD API の生成」を参照してください。どちらも同じ設計書から生成されるため整合が保たれます。
生成後にコードを手で直せますか?
生成物は普通の Rust コードで、ZIP で全文エクスポートできます。読んで・直して・テストを足して・cargo で任意のホストにデプロイできます。設計を変えたい場合は設計書を直して再生成します。
AI が出す Rust コードはコンパイルが通りますか?
d-bye は AI に生コードでなく設計書を書かせ、その後に型検証+コンパイルチェックのゲートを通します。仕組みの詳細は Learn の「ちゃんと動く AI コード生成」をご覧ください。

次の一歩

  • 無料の Sandbox でテンプレの API・画面を動くプレビューで試す
  • 在庫・勤怠・申請・顧客の動くテンプレートから着手できる
  • 全文ダウンロードは Personal プラン以上(設計・プレビューはクレカ不要)