- 我的帖子已经打上 开源推广 标签: 是
- 我的开源项目完整开源,无未开源部分: 是
- 我的开源项目已链接认可 LINUX DO 社区: 是
- 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是
- 以上选择我承诺是永久有效的,接受社区和佬友监督: 是
以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出
起因
ORM 选型的时候纠结了很久——TypeORM 功能多但坑也多,issue 堆积如山;Prisma 需要写 .prisma schema 然后生成代码,每次改字段都得 generate 一下;Sequelize 的 TS 支持像是硬塞进去的。
最后一拍脑袋:干脆自己按 Eloquent 的思路写一个吧。于是有了 Fedaco。
长什么样
模型定义用装饰器,跟 Eloquent 的 $fillable、$table 对应:
@Table({ tableName: 'users' })
export class User extends Model {
_fillable = ['email', 'name', 'age'];
@PrimaryGeneratedColumn()
declare id: number;
@Column()
declare email: string;
@HasManyColumn({ related: forwardRef(() => Post), foreignKey: 'user_id' })
public posts: FedacoRelationListType<Post>;
}
查询链式调用,写过 Eloquent 闭眼就能上手:
const users = await User.createQuery()
.where('age', '>', 18)
.with('posts')
.orderBy('created_at', 'desc')
.get();
await user.Update({ name: 'new name' });
await user.Delete();
关系那套也搬过来了:HasOne、HasMany、BelongsTo、BelongsToMany、多态(MorphTo/MorphMany),甚至 HasManyThrough 都有。不是简单的 wrapper,是按 Eloquent 的行为逻辑重新实现了一遍。
一些设计选择
驱动拆出去了。核心包 @gradii/fedaco 不带任何数据库客户端,SQLite / MySQL / MariaDB / PostgreSQL / SQL Server 各一个驱动包,你用哪个装哪个,不会拖一堆用不到的 native binding:
npm i @gradii/fedaco @gradii/fedaco-sqlite-driver
迁移 CLI 内置了。fedaco migrate、rollback、fresh、status 都有,支持 --connection 参数切换数据库连接,多库项目也好使。迁移文件就是普通的 export const up/down,不需要学新语法。
NestJS 能直接用。@gradii/nest-fedaco 模块注册连接就行,支持连接池和优雅关闭,不用自己折腾生命周期。
目前状态
日常在几个生产项目里用着,SQLite 和 PostgreSQL 跑得比较多。功能上关系、事务、连接池、读写分离、软删除这些都有了。文档用 VitePress 搭了一套,API 覆盖得还算全。
老实说还有不少可以打磨的地方,比如 migration seed、更完善的类型推导。但核心功能已经稳定,日常使用没什么问题。
链接
- GitHub: GitHub - gradii/fedaco: Laravel Eloquent With Typescript · GitHub
- 文档: Fedaco ORM
- 示例: GitHub - gradii/fedaco-examples · GitHub
MIT 协议,欢迎来 Star / 提 Issue / 吐槽 / PR。
1 个帖子 - 1 位参与者