Databases Basics
10 examples for Rust database fundamentals - 7 basic and 3 intermediate.
Busca en todas las páginas de la documentación
10 examples for Rust database fundamentals - 7 basic and 3 intermediate.
[dependencies]
sqlx = { version = "0.8", features = ["runtime-tokio", "postgres", "macros"] }
tokio = { version = "1", features = ["full"] }DATABASE_URL for local development.Open a single connection for scripts.
let conn = sqlx::PgConnection::connect(&std::env::var("DATABASE_URL")?).await?;PgConnection is one connection, not a pool.postgres://user:pass@host/db.Related: sqlx - Full sqlx guide
Share connections across async tasks.
let pool = sqlx::postgres::PgPoolOptions::new()
.max_connections(10)
.connect(&database_url)
.await?;max_connections.PgPool cheaply - inner Arc.Related: Connection Pooling - Sizing guidance
Prevent SQL injection.
let row: (i64,) = sqlx::query_as("SELECT COUNT(*) FROM users WHERE active = $1")
.bind(true)
.fetch_one(&pool)
.await?;$1 placeholders, never format strings.query_as maps columns to tuple or struct.sqlx::Error.Get generated IDs from PostgreSQL.
let rec: (i64,) = sqlx::query_as(
"INSERT INTO items (name) VALUES ($1) RETURNING id"
)
.bind("widget")
.fetch_one(&pool)
.await?;RETURNING avoids second round trip.query_scalar for single values.Handle missing rows without error.
let user = sqlx::query_as::<_, User>("SELECT id, email FROM users WHERE id = $1")
.bind(id)
.fetch_optional(&pool)
.await?;fetch_optional returns Option<Row>.None to 404 in HTTP handlers.Apply schema before serving traffic.
sqlx::migrate!("./migrations").run(&pool).await?;migrations/ directory.Related: Migrations - Schema evolution
Close pool on shutdown signal.
pool.close().await;Atomic multi-statement updates.
let mut tx = pool.begin().await?;
sqlx::query("UPDATE accounts SET balance = balance - $1 WHERE id = $2")
.bind(100_i64).bind(1_i64).execute(&mut *tx).await?;
sqlx::query("UPDATE accounts SET balance = balance + $1 WHERE id = $2")
.bind(100_i64).bind(2_i64).execute(&mut *tx).await?;
tx.commit().await?;rollback happens automatically on ? drop without commit.Related: Transactions & Isolation - Isolation levels
Wire database into HTTP service.
#[derive(Clone)]
struct AppState { pool: sqlx::PgPool }
let state = AppState { pool: pool.clone() };
let app = Router::new().route("/users", get(list_users)).with_state(state);PgPool is Clone cheaply.Related: Extractors & State - Axum state
Verify DB connectivity for /ready.
sqlx::query("SELECT 1").fetch_one(&pool).await?;/health (process up) from /ready (DB up).Stack versions: This page was written for Rust 1.97.0 (edition 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, and Polars 0.46+.
Revisado por Chris St. John·Última actualización: 16 jul 2026