Axum

Axumで安全なDB接続とCRUD構築ガイド – Rust環境設定・SQLx・SeaORM

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

開発環境の準備

Axum とデータベースを組み合わせて安全に API を作る第一歩は、ローカルの Rust ツールチェーンと自動リビルドツールを整えることです。ここでは stable の Rustup インストール手順と、コード変更時に即座に再コンパイル・再起動してくれる cargo-watch のセットアップ方法を解説します。これだけで開発サイクルが大幅に短縮され、本題の DB 接続実装へスムーズに移行できます。

Rust と Cargo のインストール

  1. 公式サイト https://rustup.rs からインストーラを取得し、シェルで実行します。
    bash
    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  2. インストールが完了したらパスを更新し、ツールチェーンのバージョンを確認します(stable がインストールされていることをチェックしてください)。
    bash
    rustc --version # 例: rustc 1.78.0 (2024‑10‑01)
    cargo --version # 例: cargo 1.78.0 (2024‑10‑01)
  3. 必要に応じてコード品質向上のためのコンポーネントを追加します。
    bash
    rustup component add clippy rustfmt

cargo-watch の導入

cargo-watch はファイルシステムの変更を監視し、指定した Cargo コマンドを自動実行してくれる便利ツールです。インストールは次の一行で完了します。

基本的な使い方

プロジェクトディレクトリで以下を実行すると、ソースが保存されるたびに cargo run が走ります。

このコマンドはローカル開発だけでなく、Docker コンテナ内でも同様に利用できるため、後述するコンテナ化開発フローでも活躍します。


プロジェクト構成とクレート設定

本章では Axum アプリの雛形作成から、必須依存クレートと環境変数管理までを体系的に示します。正しい Cargo.toml.env の設定は、マイグレーションや接続プール構築の土台となり、ビルドエラーや実行時トラブルを未然に防ぎます。

Cargo.toml に記述すべきクレート

以下は 執筆時点で安定版 の主要クレートを示した例です。バージョン指定は ^(キャレット)で「現在の最新メジャーバージョン以上」を表し、将来的に更新があっても Cargo が自動的に適合できるようにしています。

ポイント
- axumtokio は非同期 Web アプリの基盤です。
- sqlxmacros 機能を有効にすると、コンパイル時にクエリが検証できるのでバグが減ります。
- sea-orm 系は「ORM が必要」なケース用に同梱していますが、どちらか一方だけでも問題ありません。

.env の作り方と dotenvy の利用

プロジェクトルートに .env を配置し、データベース接続文字列を記述します。.gitignore に追加してリポジトリにコミットされないようにしてください。

アプリ起動時に次のコードだけを書けば、std::env::var("DATABASE_URL") が利用可能になります。


データベースマイグレーションと接続プール(sqlx)

データスキーマはコードと同様にバージョン管理が必要です。このセクションでは sqlx-cli によるマイグレーションの作成・適用手順、そして Axum へ非同期プールを注入する具体的な実装例を示します。

sqlx-cli のインストールとプロジェクト初期化

インストール後にマイグレーション用ディレクトリを作成します。

migrations/ 配下に .sql ファイルが追加され、バージョン番号は sqlx migrate add <description> で自動付与されます。

例:テーブル作成マイグレーション(PostgreSQL / MySQL 共通)

SQLite 用は BIGSERIALINTEGER PRIMARY KEY AUTOINCREMENT に置き換えるだけで動作します。

非同期接続プールの構築と Axum への組み込み

main.rs のエントリポイントでは次のようにプールを組み込みます。

これでハンドラは Extension<AnyPool> からプールを取得でき、リクエストごとに安全にコネクションを借りることが可能です。


Axum ハンドラでの CRUD 実装(sqlx)

本節では items テーブルに対する基本的な CRUD エンドポイントを実装し、型安全なクエリと統一フォーマットのエラーハンドリング手法を示します。コードは 最低限の依存関係 に抑えているため、他プロジェクトへの流用が容易です。

エンドポイント設計の概要

メソッド パス 目的
GET /items 全件取得
POST /items 新規レコード作成
PUT /items/:id 指定 ID の更新
DELETE /items/:id 指定 ID の削除

1. 共通レスポンス型とエラー定義

以下は API 全体で使うシリアライズ可能なラッパーと、thiserror によるカスタムエラーです。

2. データモデル(sqlx の query_as! 用)

3. ハンドラ実装例(一覧取得)

4. POST(レコード作成)

5. PUT と DELETE

これらを Router に登録すれば、シンプルかつ型安全な CRUD API が完成します。


SeaORM を用いた実装との比較ポイント

sqlxSeaORM はどちらも成熟したクレートですが、開発規模やチームのスキルセットに応じて選択すべき特徴があります。この節では重複しがちな記述を整理し、**実務で判断材料になる要点だけをピックアップしました。

主な相違点(表形式)

観点 sqlx SeaORM
クエリの書き方 生 SQL + query! / query_as! マクロで型安全 Entity/ActiveModel のメソッドチェーンで宣言的
マイグレーション管理 sqlx-cli が単体で提供 sea-orm-migration が統合的にサポート
パフォーマンス 手書き SQL の分、若干高速 ORM 層の抽象化に伴うオーバーヘッドが発生
学習コスト Rust と SQL の両方を理解すれば開始可能 Entity/ActiveModel, Relation の概念が必要
大規模開発での利点 柔軟性と最適化しやすさ モデル中心設計でコードベースが統一されやすい

どちらを選ぶべきか – 判断指針

  1. パフォーマンス重視・SQL が得意sqlx を採用。
  2. モデル駆動開発・チームで共有したいSeaORM が適切。
  3. マイグレーションだけは同一ツールで管理したいSeaORMmigration パッケージが便利です。

実装例はそれぞれ公式リポジトリに豊富に用意されているので、試作段階で小さなサンプルを走らせながら感触を掴むと良いでしょう。


Docker Compose と CI/CD の実践的構成

コンテナ化はローカル開発と本番環境の差異をなくす最も手軽な方法です。ここでは PostgreSQLMySQL の両方に対応できる docker-compose.yml、その上で動く cargo-watch 設定、さらに GitHub Actions を使った CI パイプラインの全体像を示します。

docker‑compose.yml(PostgreSQL デフォルト)

MySQL に切り替える手順

  1. docker-compose.ymldb サービスの imagemysql:8.0 に変更。
  2. 環境変数名を MySQL 用に書き換える(例:MYSQL_ROOT_PASSWORD, MYSQL_DATABASE など)。
  3. api コンテナの DATABASE_URLmysql://user:secret@db:3306/axum_db に置換。

このように 1 行だけ修正 すれば、同一コードベースで両方の DB を試せます。

Dockerfile(Rust 開発環境)

cargo watch -x 'run' がコンテナ起動時に自動実行され、コード変更があるたびに再ビルド・再起動します。

GitHub Actions(CI)全体像

テストコード例(integration test)

このテストは CI 環境でも同一データベースに対してエンドポイントロジックを検証でき、コードカバレッジの向上に寄与します。


まとめ

  • 開発環境rustupcargo-watch のみで完結し、変更即時リロードが実現できます。
  • プロジェクト構成では .envdotenvy により機密情報を安全に管理し、クレートはキャレット指定で将来のアップデートにも耐えられる形にしています。
  • マイグレーションsqlx-cli(または SeaORM の migration)でバージョン管理し、AnyPool を使って DB 種類横断的な接続プールを Axum に注入します。
  • CRUD 実装query! 系マクロと統一エラーハンドリングで型安全かつ見通しの良いコードが書けます。
  • SeaORM との比較では、パフォーマンス・学習コスト・チーム規模に応じた選択指針を提示しました。実際に小さなサンプルで試すと判断材料が得られます。
  • Docker Compose と CIは PostgreSQL をデフォルトにしつつ、MySQL へもワンクリックで切り替え可能な設定例を示しました。GitHub Actions による自動マイグレーション+テスト実行で、プルリクエスト時の品質保証が容易になります。

以上の手順とベストプラクティスに従えば、Rust + Axum で安全かつスケーラブルなデータベース駆動 API を短時間で構築できるはずです。ぜひ本稿のサンプルリポジトリをクローンし、自分のプロジェクトへ組み込んで実践してみてください。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-Axum