数据库概述 #
Rocket支持多种数据库集成方式,包括传统ORM和原生SQL查询。本节将介绍Rocket中数据库集成的各种选择。
数据库选择 #
关系型数据库 #
| 数据库 | 特点 | 适用场景 |
|---|---|---|
| PostgreSQL | 功能强大、扩展性好 | 复杂业务、地理数据 |
| MySQL | 流行度高、生态完善 | Web应用、中小项目 |
| SQLite | 轻量级、零配置 | 小型应用、开发测试 |
NoSQL数据库 #
| 数据库 | 特点 | 适用场景 |
|---|---|---|
| MongoDB | 文档存储、灵活 | 内容管理、日志 |
| Redis | 内存数据库、高速 | 缓存、会话 |
| DynamoDB | 托管服务、自动扩展 | 无服务器应用 |
ORM选择 #
Diesel #
Diesel是Rust中最成熟的ORM,提供编译时查询检查。
优点:
- 编译时类型安全
- 性能优秀
- 迁移工具完善
缺点:
- 学习曲线较陡
- 异步支持需要额外配置
SQLx #
SQLx提供原生SQL查询支持,同时保持类型安全。
优点:
- 原生SQL编写
- 编译时检查
- 原生异步支持
缺点:
- 需要手写SQL
- 无迁移工具
SeaORM #
SeaORM是基于SQLx构建的异步ORM。
优点:
- 异步原生支持
- 动态查询构建
- 活跃开发
缺点:
- 相对较新
- 文档较少
Rocket数据库支持 #
rocket_db_pools #
Rocket官方提供的数据库连接池支持:
toml
[dependencies]
rocket_db_pools = { version = "0.1", features = ["sqlx_sqlite"] }
rocket_sync_db_pools #
同步数据库连接池(用于Diesel等同步库):
toml
[dependencies]
rocket_sync_db_pools = { version = "0.1", features = ["diesel_postgres_pool"] }
配置数据库 #
Rocket.toml配置 #
toml
[default.databases.my_db]
url = "postgres://user:password@localhost/mydb"
[debug.databases.my_db]
url = "postgres://user:password@localhost/mydb_dev"
[release.databases.my_db]
url = "postgres://user:password@prod-db/mydb"
环境变量配置 #
bash
export DATABASE_URL="postgres://user:password@localhost/mydb"
连接池配置 #
基本配置 #
toml
[default.databases.my_db]
url = "postgres://user:password@localhost/mydb"
pool_size = 10
timeout = 5
配置项说明 #
| 配置项 | 说明 | 默认值 |
|---|---|---|
| url | 数据库连接URL | 必填 |
| pool_size | 连接池大小 | 基于CPU核心数 |
| timeout | 连接超时(秒) | 5 |
数据库模型设计 #
实体定义 #
rust
use rocket::serde::{Serialize, Deserialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(crate = "rocket::serde")]
pub struct User {
pub id: i32,
pub username: String,
pub email: String,
pub created_at: String,
}
#[derive(Debug, Deserialize)]
#[serde(crate = "rocket::serde")]
pub struct NewUser {
pub username: String,
pub email: String,
pub password: String,
}
仓储模式 #
rust
pub struct UserRepository<'a> {
conn: &'a DbConnection,
}
impl<'a> UserRepository<'a> {
pub fn new(conn: &'a DbConnection) -> Self {
Self { conn }
}
pub fn find_by_id(&self, id: i32) -> Option<User> {
// 查询逻辑
None
}
pub fn find_all(&self) -> Vec<User> {
// 查询所有
vec![]
}
pub fn create(&self, user: &NewUser) -> User {
// 创建用户
User {
id: 1,
username: user.username.clone(),
email: user.email.clone(),
created_at: "2024-01-01".to_string(),
}
}
pub fn update(&self, id: i32, user: &User) -> Option<User> {
// 更新用户
None
}
pub fn delete(&self, id: i32) -> bool {
// 删除用户
true
}
}
数据库迁移 #
迁移文件结构 #
text
migrations/
├── 20240101000000_create_users.sql
├── 20240102000000_create_posts.sql
└── 20240103000000_add_user_role.sql
迁移文件示例 #
up.sql:
sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_users_email ON users(email);
down.sql:
sql
DROP INDEX idx_users_email;
DROP TABLE users;
事务处理 #
手动事务 #
rust
pub async fn transfer_money(
db: &DbPool,
from_id: i32,
to_id: i32,
amount: f64,
) -> Result<(), String> {
// 开始事务
// 执行转账逻辑
// 提交或回滚
Ok(())
}
最佳实践 #
连接管理 #
- 使用连接池,避免频繁创建连接
- 合理设置连接池大小
- 处理连接超时
查询优化 #
- 使用索引
- 避免 N+1 查询
- 使用分页
安全考虑 #
- 使用参数化查询防止SQL注入
- 不要在代码中硬编码密码
- 使用环境变量管理敏感信息
下一步 #
了解了数据库概述后,让我们深入学习 Diesel集成,掌握Diesel ORM的使用方法。
最后更新:2026-03-28