#sqlite #postgresql #sql #migration

sqlx-models

sqlx 的迁移工具的实现正在开发中

5 个版本

0.0.5 2021 年 9 月 22 日
0.0.4 2021 年 9 月 21 日
0.0.3 2021 年 9 月 21 日
0.0.2 2021 年 9 月 15 日
0.0.1 2021 年 9 月 6 日

#2485 in 数据库接口

MIT/Apache

370KB
9K SLoC

sqlx-models

sqlx-models 是一个正在开发的 sqlx 应用的 sql 迁移管理工具的实现。请注意,这仍处于开发中,并且一些 API 可能在未来损坏。

基本教程

通过运行以下命令安装 CLI

$ cargo install sqlx-models-cli

现在运行以下命令以创建一个包含 DATABASE_URL 变量的环境文件

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

现在我们可以运行以下命令来创建数据库

$ sqlx database create

此命令将创建一个名为 database.db 的 sqlite 文件。您现在可以在您的结构上推导 Model trait,而 sqlx-models 将为您管理迁移。例如,在 src/main.rs 中编写:

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

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

#[derive(Model)]
struct Post {
    #[primary_key]
    id: i32,
    #[foreign_key(User.id)]
    author_: String,
    #[default("<UNTITLED POST>")]
    title: String,
    content: String,
}

#[derive(Model)]
struct PostLike {
    #[foreign_key(User.id)]
    #[primary_key(post_id)]
    user_id: i32,
    #[foreign_key(Post.id)]
    post_id: i32,
}

#[derive(Model)]
struct CommentLike {
    #[foreign_key(User.id)]
    #[primary_key(comment)]
    user: i32,
    #[foreign_key(Comment.id)]
    comment: i32,
    #[default(false)]
    is_dislike: bool,
}

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

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

$ sqlx migrate generate

输出应该如下所示

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

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

sqlx migrate run

输出应该如下所示

Applied 1631716729974/migrate user (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)

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

可用的属性

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(User.id)]
    user: i32, 

它还可以指定 on_deleteon_update 约束

    #[foreign_key(User.id, on_delete="cascade"]
    user_id: i32, 

这相当于

    FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE,

default

可以用来设置列的默认值。

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

unique

用于标记唯一约束。

    #[unique]
    email: String, 

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

    #[unique(hash)]
    user_id: String,
    post_id: i32,

这相当于

    UNIQUE (user_id, post_id),

依赖项

~5–7MB
~156K SLoC