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 数据库接口
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_delete
和 on_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