连接数据库
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 反馈 — 无需本地设置。