データベースへの接続
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- データベースへの接続
- コンパイル時に検査されるクエリ
- CRUD操作
- マイグレーション