数据库概述 #

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