example
example

资源 Sleet ORM - 告别手写 SQL

CnRoma

用户
高级用户
认证用户
黄金
6.00 黄金
6z_snowflake_blue.jpg

什么是 ORM?​

ORM (Object-Relational Mapping),即“对象关系映射”。对于 FiveM 开发者来说,如果你习惯了在代码里写大量的 SELECT * FROM users WHERE...,那么 ORM 的作用就是把数据库表映射成 Lua 对象
  • 手写 SQL: 你需要记住表名、字段名,并担心 SQL 注入风险和复杂的字符串拼接。
  • 使用 ORM: 你只需要操作 Lua 函数(如 sleet.select() 或 col.softDelete()), ORM 会自动帮你生成并执行准确的 SQL 语句

什么是 Sleet-ORM?​

SleetDrizzle ORMSchema 即代码 理念带入 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]/sleet

2. 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
 
最后编辑:
后退
顶部