Rust中的数据库迁移:Diesel、SeaORM和sqlx工具概述

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Rust中的数据库迁移:Diesel、SeaORM和sqlx工具概述

管理数据库模式的变更,是任何Web应用程序开发中的关键任务之一。在Rust生态系统中,有几种成熟的工具可用于此目的。在本文中,我们将探讨三种主要的迁移方法:Diesel、SeaORM和sqlx。每种方法都提供了其独特的管理数据库模式版本的方式,选择合适的工具可能会对项目架构产生重大影响。



1. Diesel —— 集成迁移功能的经典ORM

Diesel 是一个安全、可扩展的Rust ORM和Query Builder,它与迁移系统紧密集成。其主要优势在于编译时类型检查:表结构基于数据库模式生成,从而消除了类型不匹配的错误。



Diesel中的迁移是普通的SQL文件,组织在 migrations/ 目录下。每个迁移包含两个文件:up.sql(应用更改)和 down.sql(回滚)。



创建用户表的迁移结构示例:



-- migrations/2024-01-15-120000_create_users/up.sqlCREATE TABLE users (    id SERIAL PRIMARY KEY,    username VARCHAR(255) NOT NULL UNIQUE,    email VARCHAR(255) NOT NULL UNIQUE,    created_at TIMESTAMP NOT NULL DEFAULT NOW());

-- migrations/2024-01-15-120000_create_users/down.sqlDROP TABLE IF EXISTS users;


使用CLI工具 diesel_cli 运行迁移:



# 安装cargo install diesel_cli --no-default-features --features postgres

# 运行迁移diesel migration run

# 回滚上一次迁移diesel migration revert

# 生成新的迁移diesel migration generate create_users


Diesel的优点:

  • 编译时完全类型检查
  • 简单明了的迁移结构(纯SQL)
  • 内置回滚支持
  • 出色的性能


Diesel的缺点:

  • 需要安装额外的CLI工具
  • 对于多数据库项目的配置较为复杂
  • 与sqlx相比灵活性较低


2. SeaORM —— 具有灵活迁移系统的异步ORM

SeaORM(基于 sea-query 和 sqlx)是一个异步ORM,它提供了一种更现代的迁移方法。与Diesel不同,SeaORM中的迁移使用Rust编写,而不是SQL,这使得可以利用语言的强大功能来描述模式更改。



使用SeaORM的迁移示例:



use sea_orm_migration::prelude::*;

#[derive(DeriveMigrationName)]pub struct Migration;

#[async_trait::async_trait]impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { manager .create_table( Table::create() .table(Users::Table) .if_not_exists() .col( ColumnDef::new(Users::Id) .integer() .not_null() .auto_increment() .primary_key(), ) .col(ColumnDef::new(Users::Username).string().not_null()) .col(ColumnDef::new(Users::Email).string().not_null()) .col( ColumnDef::new(Users::CreatedAt) .timestamp() .default(Expr::current_timestamp()), ) .to_owned(), )

推荐