0Pricing
Learn Rust Coding · レッスン

データベースへの接続

sqlxプール

「データベースへの接続」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。

sqlxとは

sqlxは非同期対応の純粋なRust製SQLツールキットです。ORMではないため、実際のSQLを記述しながら、コンパイル時チェックと型安全な結果を利用できます。

  • Postgres、MySQL、SQLiteをサポートします
  • Tokioなどの非同期ランタイムを基盤としています

sqlxの追加

必要なランタイムとデータベース機能を指定してsqlxを宣言します。これによりCargo.tomlが編集され、ターミナルでコマンドが実行されます。

[dependencies]
sqlx = { version = "0.7", features = ["runtime-tokio", "postgres"] }
tokio = { version = "1", features = ["full"] }

接続文字列

接続文字列(DSN)は、データベースへの接続方法をsqlxに伝えます。

  • Postgres: postgres://user:pass@host:5432/dbname
  • SQLite: sqlite://app.db

なぜ接続プールを使うのか

クエリごとに接続を開くと時間がかかります。プールは再利用可能な接続を複数保持し、必要に応じて割り当て、処理後に返します。

  • 同時実行数を制限できます
  • 接続コストを分散できます

プールの作成

PgPoolOptionsを使ってプールを設定し、接続します。通常は起動時に一度だけ実行します。

use sqlx::postgres::PgPoolOptions;

async fn connect() -> sqlx::Pool<sqlx::Postgres> {
    PgPoolOptions::new()
        .max_connections(5)
        .connect("postgres://user:pass@localhost/app")
        .await
        .unwrap()
}

プールの設定

最大接続数や取得タイムアウトなどのオプションを使って、ワークロードに合わせてプールを調整します。

use sqlx::postgres::PgPoolOptions;
use std::time::Duration;

fn options() -> PgPoolOptions {
    PgPoolOptions::new()
        .max_connections(10)
        .acquire_timeout(Duration::from_secs(3))
}

プールを使った単純なクエリ

プール(またはその参照)をexecutorとして渡し、クエリを実行します。プールが自動的に接続を1つ取得します。

use sqlx::Pool;
use sqlx::Postgres;

async fn ping(pool: &Pool<Postgres>) -> i32 {
    let row: (i32,) = sqlx::query_as("SELECT 1")
        .fetch_one(pool)
        .await
        .unwrap();
    row.0
}

Rustだけでプールをモデル化する

プールは、再利用可能なリソースを上限付きで集めたものと考えられます。この実行可能な例では、取得と返却の動作を概略的に示します。

struct Pool { available: u32, max: u32 }

impl Pool {
    fn acquire(&mut self) -> bool {
        if self.available > 0 { self.available -= 1; true } else { false }
    }
    fn release(&mut self) { self.available += 1; }
}

fn main() {
    let mut p = Pool { available: 2, max: 2 };
    println!("{}", p.acquire());
    println!("{}", p.acquire());
    println!("{}", p.acquire());
    p.release();
    println!("{}", p.acquire());
}

環境変数からDSNを読み取る

秘密情報をソースコードに含めないようにします。起動時に環境変数からDATABASE_URLを読み取ります。

use sqlx::postgres::PgPoolOptions;

async fn connect() -> sqlx::Pool<sqlx::Postgres> {
    let url = std::env::var("DATABASE_URL").unwrap();
    PgPoolOptions::new().connect(&url).await.unwrap()
}

Cloneのコストは低い

Poolは内部で参照カウントされています。Cloneしても同じ基盤の接続を共有するため、タスクへ自由にCloneを渡せます。

use sqlx::{Pool, Postgres};

async fn spawn_work(pool: Pool<Postgres>) {
    let p2 = pool.clone();
    tokio::spawn(async move {
        let _ = sqlx::query("SELECT 1").execute(&p2).await;
    });
}

プールを閉じる

シャットダウン時にはclose().awaitを呼び出し、すべての接続を正常に排出して閉じます。

use sqlx::{Pool, Postgres};

async fn shutdown(pool: Pool<Postgres>) {
    pool.close().await;
}

理解度チェック

sqlxによる接続についての理解度を確認しましょう。

まとめ

sqlxによる接続方法を学びました。

  • sqlxは非同期対応で型安全なSQLツールキットであり、ORMではありません
  • DSNはデータベースの場所を示します
  • PgPoolOptionsを使い、制限とタイムアウトを設定したプールを構築します
  • プールは低コストでCloneでき、シャットダウン時に閉じる必要があります

次は、コンパイル時にチェックされるクエリです。

よくある質問

「データベースへの接続」レッスンは無料ですか?

はい。「データベースへの接続」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。

「データベースへの接続」で何を学びますか?

sqlxプール ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn Rust Codingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「データベースへの接続」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn Rust Codingレッスンでコードを書いて実行できますか?

はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. データベースへの接続
  2. コンパイル時に検査されるクエリ
  3. CRUD操作
  4. マイグレーション
← Learn Rust Codingに戻る