0Pricing
Learn Rust Coding · 课时

连接数据库

sqlx 连接池

连接数据库 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 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))
}

通过连接池执行简单查询

将连接池(或其引用)作为执行器传入,以运行查询。连接池会自动获取一个连接。

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()
}

克隆开销很小

Pool 在内部使用引用计数。克隆它会共享同一组底层连接,因此您可以放心地将克隆传给各个任务。

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 创建带有限制和超时设置的连接池
  • 连接池的克隆开销很小,并且应在关闭应用时关闭

下一步:编译时检查的查询。

常见问题解答

「连接数据库」课时是免费的吗?

是的 — 「连接数据库」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。

「连接数据库」这节课中我会学到什么?

sqlx 连接池 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 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