[Showcase] 基于 Rust & TeaQL 构建的 2026 世界杯命令行交互程序 🏆 (打包仅 7MB)
大家好,今天想和大家分享一个用 Rust 编写的高性能、交互式 CLI 小项目:World Cup 2026 - Rust Edition 🏆。
这原本是一个基于 Java 的项目,近期我们将它 100% 移植到了 Rust 生态。它的核心是由我们开发的 TeaQL 数据引擎和内嵌的 SQLite 数据库驱动。得益于 Rust 的特性,整个程序> 被编译成了一个无外部依赖的独立本地可执行文件。
告别了 JVM 和冷启动延迟,配合 musl 进行全静态编译后,最终打包出来的 scratch Docker 镜像不到 7MB,运行体验快如闪电!⚡️
🌟 核心亮点
- 交互式 CLI Shell:提供了一个完整的 REPL 交互体验,带有专属的
wc2026>提示符。 - 精美的终端 UI:支持查看 A-L 组的所有分组数据。文本对齐完美,配合 Emoji 渲染和动态颜色编码,终端视觉体验极佳。
- 全局积分榜:支持一键纵览全量 48 支球队的全球大排行。
- TeaQL 强类型支持:借助生成的 TeaQL Rust 宏与 ORM,能将数据无缝、安全地映射到内嵌的 SQLite 中。
- 极致轻量:纯静态编译,告别臃肿。
🛠️ 怎么玩?
进入交互界面后,你可以使用以下命令:
group <A-L>- 查看特定小组的当前积分榜(例如:group A)。groups- 罗列所有小组的排名情况。rank- 查看整个赛事的全球总榜单。clear/exit/quit- 清屏或退出程序。
本地运行:
# 源码编译运行
cd rust-workspace
cargo run --release
使用 Docker(极简镜像):
docker run -it --rm teaql/worldcup2026:latest group A
📚 Rust 开发体验分享:TeaQL 的丝滑 API
在用 Rust 重写业务逻辑的过程中,TeaQL 帮我们极大地简化了与数据库的交互。这里分享几种典型的 API 场景:
1. 复杂关系查询 & 排序 (Q API)
Q API 提供了强类型的链式调用。比如我们要加载带有关联球队信息的积分榜,并进行多维度的复杂排序,代码写起来非常优雅:
let standings = Q::group_standings()
.select_tournament_team_with(Q::tournament_teams().select_self())
.with_match_group_matching(Q::match_groups().with_id_is(g.id()))
.order_by_points_desc()
.order_by_goal_difference_desc()
.order_by_goals_for_desc()
.purpose("cli").execute_for_list(ctx).await?;
2. 字段读取 (E API)
一种安全且强类型的方式,从已加载的实体中提取数据:
let name = E::tournament(entity)
.get_tournament_name()
.eval();
3. 数据写入与审计 (Entity API)
在创建新数据或更新数据时,我们可以链式修改字段,甚至直接内置审计日志(Audit Log):
let mut t = Q::tournaments().new_entity(ctx);
t.update_tournament_name("FIFA World Cup 2026".to_string());
t.update_total_teams(48);
// 持久化保存,并自动生成 "Seed tournament" 的审计追踪日志
t.audit_as("Seed tournament").save(ctx).await?;
截图

💡 总结
将重度依赖运行时的应用转为 Rust 构建,不仅将资源占用和打包体积缩小了几个数量级,运行效率和启动速度也达到了极致。同时,配合自动生成的 TeaQL 强类型结构,我们在 Rust 中写业务逻>辑和数据库交互也能像使用高级动态语言一样得心应手。
欢迎大家克隆代码在本地把玩!如果你对 Rust 的 CLI 开发、静态编译打包,或者 TeaQL 数据库引擎有任何想法,非常欢迎在评论区交流探讨~ 🍻
👉 项目源码传送门: 002-world-cup-2006-tui
评论区
写评论还没有评论