什么是 ORM?
ORM (Object-Relational Mapping),即“对象关系映射”。对于 FiveM 开发者来说,如果你习惯了在代码里写大量的 SELECT * FROM users WHERE...,那么 ORM 的作用就是把数据库表映射成 Lua 对象。- 手写 SQL: 你需要记住表名、字段名,并担心 SQL 注入风险和复杂的字符串拼接。
- 使用 ORM: 你只需要操作 Lua 函数(如 sleet.select() 或 col.softDelete()), ORM 会自动帮你生成并执行准确的 SQL 语句
什么是 Sleet-ORM?
Sleet 将 Drizzle ORM 的 Schema 即代码 理念带入 FiveM 的 Lua 脚本环境。告别裸 SQL 字符串,用 Lua 定义表结构,让 Sleet 生成干净的参数化查询。为什么在 FiveM 开发中使用
在处理复杂的玩家数据, 车辆日志或库存系统时, 手动管理 SQL 往往会导致代码臃肿且难以维护...Sleet ORM 提供了以下核心优势:- Schema 即代码 — 在 Lua 里定义表结构, 无需 SQL 字符串
- 链式查询构建器 — SELECT / INSERT / UPDATE / DELETE 全部支持点号链式调用
- 完整类型推断 — 运行 sleet generate 后,LuaLS 无需任何手写 ---@type 即可推断 XxxRecord[]
- 列注释 — .comment('描述') 同步到 IDE hover 提示和 SQL COMMENT 子句
- 安全 — 所有值使用 ? 参数占位符,彻底防止 SQL 注入
- 透明 — 每个查询都有 .toSQL() 调试方法
- 原始 SQL 转义口 — sl.sql() 用于 COUNT(*) 等聚合表达式和原子更新
- 零运行时依赖 — 仅需 oxmysql
- 内置 require 系统 — 自带 package/require shim(设计参考 ox_lib),有无 ox_lib 均可使用, 在任何脚本中直接 require 'server.schema'
- CLI 工具 — 单个 Go 二进制 (sleet.exe), 生成 EmmyLua 类型注解和建表 SQL
安装
1. 下载资源
git clone https://github.com/SleetCo/sleet-orm [sleet]/sleet2. server.cfg
代码:
ensure oxmysql
ensure your_sleet_user_resource
3. 你的资源 fxmanifest.lua
代码:
fx_version 'cerulean'
game 'gta5'
server_scripts {
'@oxmysql/lib/MySQL.lua',
'@sleet/sleet.lua', -- 注入全局 Sleet + 安装 package/require shim
'server/main.lua', -- 在脚本内用 require 'server.schema' 加载 schema
}
4. 安装 CLI
单个 GO 二进制, 无需任何运行时推荐使用 npm 进行安装
npm install -g sleet-orm-cli快速开始
定义 Schema
代码:
-- server/schema.lua
local sl = Sleet -- @sleet/sleet.lua 注入的全局变量
local players = sl.table('players', {
id = sl.serial().primaryKey().comment('玩家自增ID'),
identifier = sl.varchar(64).notNull().unique().comment('Steam / Discord 标识符'),
name = sl.varchar(255).notNull().comment('玩家名称'),
money = sl.int().default(500).comment('现金'),
bank = sl.int().default(2500).comment('银行余额'),
is_admin = sl.boolean().default(false).comment('管理员标志'),
metadata = sl.json().comment('扩展数据'),
last_seen = sl.timestamp().defaultNow().comment('最后在线时间'),
})
-- return 后可在其他脚本通过 require 'server.schema' 获取
return { players = players }
查询
代码:
-- server/main.lua
local sl = Sleet
local s = require 'server.schema'
local db = sl.connect()
-- SELECT — 运行 `sleet generate` 后 LuaLS 自动推断 PlayersRecord[]
local rows = db.select()
.from(s.players)
.where(sl.eq(s.players.identifier, identifier))
.limit(1)
.execute()
local player = rows[1] -- player: PlayersRecord ✓
-- INSERT — 返回 insertId
local newId = db.insert(s.players)
.values({ identifier = 'steam:xxx', name = GetPlayerName(source) })
.execute()
代码:
-- UPDATE — 返回受影响行数
db.update(s.players)
.set({ money = sl.sql('`money` + 500') })
.where(sl.eq(s.players.id, player.id))
.execute()
-- DELETE
db.delete(s.players)
.where(sl.eq(s.players.id, newId))
.execute()
github: https://github.com/SleetCo/sleet-orm
使用文档: https://sleet.ls-rp.cn
QQ交流群: 914053352
最后编辑:
