#sqlite #database-migrations #sql-database #postgresql #sql #migration

sql_from_models

适用于PostgreSQL、MySQL或SQLite应用的迁移管理库

4个版本

0.1.6 2024年2月24日
0.1.5 2024年2月23日
0.1.4 2023年8月17日
0.1.3 2023年8月17日

854数据库接口

每月下载 22

Apache-2.0

88KB
2K SLoC

sql_from_models

sql_from_models是基于支持大序列号的Models的分支。Models是一个SQL迁移管理工具。它支持PostgreSQL、MySQL和SQLite。它被设计为作为您的应用程序库使用,但也包括一个CLI工具,可以从Rust代码生成Sql迁移。

快速入门

通过运行以下命令安装CLI

$ cargo install sql_from_models-cli

现在运行以下命令创建一个环境文件,其中设置了DATABASE_URL变量

$ echo "DATABASE_URL=sqlite://database.db" > .env

或者也可以使用以下命令将其设置为环境变量

$ export DATABASE_URL=sqlite://database.db

现在我们可以通过以下命令创建数据库

$ models database create

此命令将创建一个名为database.db的SQLite文件。现在您可以在结构体上推导出Model特质,并且models将为您管理迁移。例如,在src/main.rs中写入

#![allow(dead_code)]
use models::Model; 

#[derive(Model)]
struct Profile {
    #[primary_key]
    id: i32,
    #[unique]
    email: String,
    password: String,
    is_admin: bool,
}

#[derive(Model)]
struct Post {
    #[primary_key]
    id: i32,
    #[foreign_key(Profile.id)]
    author: i32,
    #[default("<Untitled Post>")]
    title: String,
    content: String,
}

#[derive(Model)]
struct PostLike {
    #[foreign_key(Profile.id, on_delete="cascade")]
    #[primary_key(post_id)]
    profile_id: i32,
    #[foreign_key(Post.id, on_delete="cascade")]
    post_id: i32,
}

#[derive(Model)]
struct CommentLike {
    #[foreign_key(Profile.id)]
    #[primary_key(comment_id)]
    profile_id: i32,
    #[foreign_key(Comment.id)]
    comment_id: i32,
    is_dislike: bool,
}

#[derive(Model)]
struct Comment {
    #[primary_key]
    id: i32,
    #[foreign_key(Profile.id)]
    author: i32,
    #[foreign_key(Post.id)]
    post: i32,
}
fn main() {}

如果您现在运行以下命令,您的迁移应该会自动创建。

$ models generate

输出应该如下所示

Generated: migrations/1632280793452 profile
Generated: migrations/1632280793459 post
Generated: migrations/1632280793465 postlike
Generated: migrations/1632280793471 comment
Generated: migrations/1632280793476 commentlike

您可以在migrations/文件夹中查看生成的迁移。要执行这些迁移,您可以执行以下命令

models migrate run

输出应该如下所示

Applied 1631716729974/migrate profile (342.208µs)
Applied 1631716729980/migrate post (255.958µs)
Applied 1631716729986/migrate comment (287.792µs)
Applied 1631716729993/migrate postlike (349.834µs)
Applied 1631716729998/migrate commentlike (374.625µs)

如果我们以后修改了应用程序中的这些结构,我们可以生成新的迁移来更新表。

回滚迁移

Models可以使用带有-r标志的down迁移生成。注意,简单且可逆的迁移不能混合使用

$ models generate -r

要回滚最后执行的迁移,可以运行

$ models migrate revert

如果您以后想查看哪些迁移尚未应用,也可以执行

$ models migrate info

必须先回滚已应用的迁移,才能将其删除。

可用属性

primary_key

它用于标记表的主键。

    #[primary_key]
    id: i32, 

对于具有多列主键的表,使用以下语法

    #[primary_key(second_id)]
    first_id: i32, 
    second_id: i32, 

这相当于

    PRIMARY KEY (first_id, second_id),

foreign_key

它用于标记外键约束。

    #[foreign_key(Profile.id)]
    profile: i32, 

它还可以指定on_deleteon_update约束

    #[foreign_key(Profile.id, on_delete="cascade")]
    profile_id: i32, 

这相当于

    FOREIGN KEY (profile_id) REFERENCES profile (id) ON DELETE CASCADE,

default

它可以用于设置列的默认值。

    #[default(false)] // when using SQLite use 0 or 1
    is_admin: bool, 
    #[default("")]
    text: String, 
    #[default(0)]
    number: i32, 

unique

它用于标记唯一约束。

    #[unique]
    email: String, 

对于多列唯一约束,使用以下语法

    #[unique(post_id)]
    profile_id: String,
    post_id: i32,

这相当于

    UNIQUE (profile_id, post_id),

CLI 快捷方式

CLI 包含以下快捷方式

  • models 数据库 -> models db
  • models 生成 -> models gen
  • models 迁移 -> models mig

依赖

~4–10MB
~222K SLoC