完全可以!SeaORM 提供了 DeriveActiveEnum 宏,可以轻松实现这个需求。下面是完整的实现方案:
完整实现
1. 迁移文件(存储为字符串)
use sea_orm_migration::{prelude::*, schema::*};
// 定义枚举的 Rust 类型
#[derive(Iden, Clone, Debug, PartialEq, EnumIter, DeriveRelation)]
pub enum CommentsStatus {
Table,
Pending,
Approved,
Deleted,
}
#[derive(Iden)]
enum Comments {
Table,
Id,
UserId,
SiteId,
RootId,
ParentId,
PagePath,
Content,
Status, // 使用字符串存储
Nick,
Link,
Email,
Device,
Location,
IsSticky,
UpVote,
DownVote,
CreatedAt,
UpdatedAt,
DeletedAt,
}
#[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(Comments::Table)
.if_not_exists()
.col(pk_auto(Comments::Id))
.col(integer(Comments::UserId).null())
.col(integer(Comments::SeaId))
.col(integer(Comments::RootId).null())
.col(integer(Comments::ParentId).null())
.col(string(Comments::PagePath))
.col(text(Comments::Content))
// 字符串类型,兼容所有数据库
.col(string(Comments::Status).default("pending"))
.col(string(Comments::Nick))
.col(string(Comments::Link))
.col(string(Comments::Email))
.col(string(Comments::Device))
.col(string(Comments::Location))
.col(boolean(Comments::IsSticky).default(false))
.col(integer(Comments::UpVote).default(0))
.col(integer(Comments::DownVote).default(0))
.col(date_time(Comments::CreatedAt))
.col(date_time(Comments::UpdatedAt))
.col(date_time(Comments::DeletedAt).null())
.to_owned(),
)
.await
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.drop_table(Table::drop().table(Comments::Table).to_owned())
.await
}
}
错误处理的本质,不是“程序报错了怎么办”,而是系统在出现异常情况时,如何决定继续运行、终止运行、释放资源,以及把问题传递给谁。
不同语言在语法和机制上差异很大,但它们最终都在回答同几类问题:
- 什么算错误,什么算 bug
- 哪些错误可以恢复,哪些错误必须终止
- 错误应该如何向上层传播
- 资源应该在什么时机释放
- 异步流程中的错误还能不能沿着原来的调用链处理
错误不止一种
从工程视角看,错误通常至少可以分成两类:
- 可恢复错误:操作失败了,但程序仍然可以决定如何处理,例如文件不存在、网络超时、参数格式不合法
- 不可恢复错误:程序已经进入不可信状态,继续运行可能造成更严重的问题,例如数组越界、空指针解引用、违反内部不变量
异步编程的价值,从来不是让单个任务跑得更快,而是在有限线程中吞下海量 I/O 并发。
当网络、磁盘、数据库成为瓶颈时,同步模型会让线程大量停留在“等待结果”的状态;异步模型则把这段等待时间让出来,让线程去执行别的任务。它的核心并非“消除等待”,而是重构等待。
异步到底解决了什么问题
先看最朴素的区别:
- 同步模型中,任务发起 I/O 后,线程通常要一直等到结果返回
- 异步模型中,任务发起 I/O 后会主动挂起,把线程让给其他任务
因此,异步真正改善的不是单次请求延迟,而是系统整体的吞吐和资源利用率。
MeiliSearch 是 Rust 编写的轻量级搜素引擎,快而高效
安装&&启动
或者前往https://github.com/meilisearch/meilisearch/releases下载构建好的包
配置 Master Key,启动 MeiliSearch 时如果没有设置,则会自动生成一个 Master Key,将它设置到环境变量中,不要公开:
Rust 由 Mozila 一位工程师创造,他对这个语言的期望是:安全,性能,特性广泛,以内存安全为第一原则,注重并发安全,持续提升性能,现代化语言特性,拥抱开源社区。Rust 是通用型语言,适用所有领域绝大数场景,但本质是弥补 C 的内存安全问题,因为百分之 70 的安全漏洞都是非法访问内存引起。Rust 将会为各领域的基础设施做出贡献,但也有可能会出现杀手级应用
安装 && 编译 && 运行
一般不单独安装 Rust 的编译器,而是使用 rustup 安装 Rust 相关的一整套工具链:编译器,标准库,Cargo 等
前置知识
- 编程语言
数据结构与算法是一个云里雾里的概念,在学习的过程中,没有必要去了解这些,尤其是在应用层面上面,数据结构与算法就显得不是特别重要,但是如果要了解设计层面上的东西,那么数据结构与算法就显得非常重要。可以不用,但是必须了解
数据结构就是在计算机中,存储和组织数据的方式,好比在图书馆中如何排列组织一些书,在如何取出书之前,应该先想一想如何摆放一些书籍。在计算机中解决问题的效率往往取决于数据的组织方式,计算机存储的数据量更大,种类更多,以什么样的方式来组织数据就是数据结构需要考虑的问题
每天不停的刷知乎、B站、微博、抖音、朋友圈、被动接受信息密度低的资讯,并对这些碎片化的信息只灌入而不输出,厌烦深度思考,拒绝梳理与总结,不能够内化为自己的价值体系,并输出独特的见解
日夜沉迷游戏,通过虚拟的胜利获得成就感、寻求更高的段位来获得自我认同,或者钻研如何求欢、以暧昧对象的人数当做勋章。久而久之就对需要长期投入来获得更高回报的事情产生厌恶,比如运动、看书、提升专业能力、未来的规划等
毫无意义的熬夜和自我透支,日复一日的不良作息,愈发意志消沉、放纵自己,不管到最后做什么事情都提不起劲,因为眼前的诱惑带来的快感比坚持容易的多
眼高手低是当代大学生的通病,明天的事后天说,下周的事下周再看,反正拖就完事啦,最好啥也不用干
JavaScript 的对象拥有一个特殊的内部关联[[Prototype]]。它的值要么为null,要么指向另一个对象(即其原型)。当读取对象缺失的属性时,引擎会沿此关联向上追溯,这种行为即原型委托。
尽管在现代工程中建议使用 Object.getPrototypeOf(),但仍可通过传统的 proto 属性访问此关联:
let A = { name: 'A' };
let B = {};
// B 的原型没有指向 A
console.log(B.name); // undefined
// B 的原型指向了 A
B.__proto__ = A;
console.log(B.name); // 'A'
Git 是一套程序源代码的分布式版本管理系统,最初用于管理 Linux 核心代码的开发,后来被多个开源工程使用,如今已经成为互联网协作开发的标准源代码管理工具。从开发者的角度上来看,Git 有以下功能:
- 从服务器上克隆代码到自己的机器上
- 在自己的机器上创建分支,修改代码
- 将自己机器上的代码推送到服务器上
- 合并分支
- .....
主要的竞争对手:
- SVN:中式版本控制系统,适合单一主干开发,但分支合并复杂
- CVS:较老的版本控制系统,已逐渐被淘汰
- Mercurial:与 Git 类似的分布式版本控制系统,易用性较高,但在社区普及度不如 Git
