Rust数据库迁移:工具与库概览
在开发任何应用程序时,迟早都需要更改数据库结构。添加新列、创建索引或重命名表——所有这些都需要对模式版本进行精细管理。在Rust生态系统中,有几种成熟的解决方案可用于执行迁移。在本文中,我们将介绍可用于数据库模式管理任务的主要方法和库。
为什么需要迁移?
迁移可以:
- 对更改进行版本控制——每个迁移都是一个带有版本号的独立文件。
- 自动化部署——在部署时应用和回滚更改。
- 支持团队协作——所有开发人员可以在本地同步模式。
- 避免错误——迁移可防止意外更改数据。
Rust中的主要迁移工具
1. Diesel Migration(内置于Diesel ORM)
Diesel——Rust中最流行的ORM。它通过CLI工具diesel_cli提供内置的迁移引擎。
主要功能:
- 生成包含SQL查询的迁移文件。
- 支持PostgreSQL、MySQL、SQLite。
- 命令:
migration generate、migration run、migration redo。 - 自动跟踪已应用的迁移。
创建和应用迁移的示例:
# 安装CLIcargo install diesel_cli --no-default-features --features postgres
# 创建新迁移diesel migration generate create_users
# 在migrations/文件夹中将出现两个SQL文件:# up.sql——用于应用的代码# down.sql——用于回滚的代码
# 应用迁移diesel migration runup.sql的内容:
CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT NOW());down.sql:
DROP TABLE IF EXISTS users;2. SQLx migrate(SQLx生态系统的一部分)
SQLx——SQL数据库的异步驱动程序。其迁移子系统无需ORM,仅使用纯SQL脚本即可工作。
显著特点:
- 支持PostgreSQL、MySQL、SQLite、MSSQL。
- 与CLI集成,并可从代码中以编程方式运行。
- 可以在迁移前使用Rust代码进行检查。
- 自动完整性检查(文件哈希)。
在Rust中以编程方式运行迁移的示例:
use sqlx::migrate::Migrator;use sqlx::PgPool;
#[tokio::main]async fn main() -> Result<(), sqlx::Error> { let pool = PgPool::connect("postgres://user:pass@localhost/db").await?; // 指定迁移文件夹的路径 let migrator = Migrator::new(std::path::Path::new("./migrations")).await?; // 运行所有未应用的迁移 migrator.run(&pool).await?; println!("迁移成功完成!"); Ok(())}migrations/文件夹的结构:
migrations/├── 20231001_initial.sql├── 20231002_add_email_index.sql└── 20231003_create_roles.sql每个文件包含普通的SQL,例如:
-- 20231001_initial.sqlCREATE TABLE IF NOT EXISTS users ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), username TEXT NOT NULL UNIQUE);3. SeaORM Migrator(SeaORM的一部分)
SeaORM——一个现代化的异步ORM,它提供了自己的迁移系统SeaORM Migrator。它允许用Rust而不是SQL编写迁移,这