Skip to content

SQL API 参考

v1.1.19+

SQL API 允许你执行在 Lovrabet 平台上配置的自定义 SQL 查询。

ℹ️ 版本要求此功能从 SDK v1.1.19 版本开始支持。

💡 新手指南如果你是第一次使用自定义 SQL,建议先阅读 自定义 SQL 使用教程,本文档仅作为 API 参考。

什么时候使用 SQL API?

场景推荐 API
简单的 CRUD 操作Dataset API
跨表关联查询SQL API
复杂的聚合统计SQL API
自定义报表SQL API

API 方法

execute() - 推荐方式 v1.2.0+

使用 client.sql 命名空间执行 SQL 查询。

方法签名

TypeScript
client.sql.execute<T>({ sqlCode, params }: SqlExecuteParams): Promise<SqlExecuteResult<T>>
client.sql.execute<T>(sqlCode: string | number, params?: Record<string, any>): Promise<SqlExecuteResult<T>>

参数

参数类型必填说明
sqlCodestring | numberSQL 代码,格式:"xxxxx-xxxxx" 或数字 ID
paramsRecord<string, any>SQL 参数对象,用于参数化查询

返回值

TypeScript
interface SqlExecuteResult<T> {
  execSuccess: boolean; // SQL 执行是否成功
  execResult?: T[]; // 查询结果数组(仅成功时存在)
}

⚠️ 重要SDK 返回的是包含 execSuccessexecResult 的对象,不是直接返回数组。

应用层必须先检查 execSuccess 再使用 execResult。

executeSql() - 兼容方式

使用 client.api 命名空间(向后兼容,不推荐)。

TypeScript
client.api.executeSql<T>(sqlCode: string | number, params?: Record<string, any>): Promise<SqlExecuteResult<T>>

快速开始

基础调用(推荐方式)

TypeScript
import { createClient, sqlSafe } from "@lovrabet/sdk";

// 1. 创建客户端
const client = createClient({
  accessKey process.env.LOVRABET_ACCESS_KEY,
  appCode: "your-app-code",
});

// 2. 执行 SQL - 使用 sqlSafe 语法糖(推荐)
const { data, error } = await sqlSafe(() =>
  client.sql.execute({ sqlCode: "xxxxx-xxxxx" })
);

// 3. 处理结果(一次检查)
if (error) {
  console.error("查询失败:", error.message);
  return;
}

// data 直接是查询结果数组
console.log(`查询成功,返回 ${data.length} 条数据`);
data.forEach((row) => console.log(row));

传统方式(不推荐)

TypeScript
// 不使用 sqlSafe:需要手动检查 execSuccess
const result = await client.sql.execute({ sqlCode: "xxxxx-xxxxx" });

if (result.execSuccess && result.execResult) {
  console.log(`查询成功,返回 ${result.execResult.length} 条数据`);
  result.execResult.forEach((row) => console.log(row));
} else {
  console.error("SQL 执行失败");
}

参数化查询

TypeScript
// SQL 中使用 #{paramName} 定义参数
// 例如:SELECT * FROM users WHERE id = #{userId} AND status = #{status}

// 推荐方式:对象参数
const result = await client.sql.execute({
  sqlCode: "xxxxx-xxxxx",
  params: {
    userId: 123,
    status: "active",
  }
});

// 或直接传参
const result = await client.sql.execute("xxxxx-xxxxx", {
  userId: 123,
  status: "active",
});

if (result.execSuccess && result.execResult) {
  console.log("查询结果:", result.execResult);
}

TypeScript 类型支持

TypeScript
// 定义结果类型
interface UserStat {
  id: number;
  name: string;
  login_count: number;
}

// 使用 sqlSafe + 泛型
const { data, error } = await sqlSafe<UserStat>(() =>
  client.sql.execute({ sqlCode: "xxxxx-xxxxx" })
);

if (error) {
  console.error("查询失败:", error.message);
  return;
}

// data 是 UserStat[],类型安全
data.forEach((user) => {
  console.log(`${user.name}: ${user.login_count} 次登录`);
});

错误处理

使用 sqlSafe(推荐)

TypeScript
import { sqlSafe } from "@lovrabet/sdk";

// 一次检查处理所有错误
const { data, error } = await sqlSafe(() =>
  client.sql.execute({ sqlCode: "xxxxx-xxxxx" })
);

if (error) {
  // 区分错误类型
  if (error.code === 'SQL_ERROR') {
    // 业务逻辑失败(execSuccess = false)
    console.error('SQL 执行失败:', error.cause);
  } else {
    // HTTP 错误(404、500 等)
    console.error('请求失败:', error.message, error.status);
  }
  return;
}

// data 直接是查询结果数组
console.log(`查询到 ${data.length} 条记录`);

区分错误类型

TypeScript
const { data, error } = await sqlSafe(() =>
  client.sql.execute({ sqlCode: 'user-stats' })
);

if (error) {
  // 业务错误:execSuccess = false
  if (error.code === 'SQL_ERROR') {
    const originalResult = error.cause;  // 原始 SqlExecuteResult
    console.error('业务失败:', originalResult);
  }
  // HTTP 错误:404、500 等
  else if (error.status) {
    console.error('HTTP 错误:', error.status, error.message);
  }
  // 其他错误
  else {
    console.error('未知错误:', error.message);
  }
  return;
}

// 使用数据
data.forEach(row => console.log(row));

常见错误码

错误码说明解决方案
401认证失败检查 AccessKey 或重新登录
404SQL 不存在检查 SQL Code 是否正确
500服务器错误稍后重试或联系技术支持

常见问题

execSuccess 为 false 是什么原因?

execSuccess: false 表示 SQL 在平台执行失败,常见原因:

  • SQL 语法错误
  • 引用的表或字段不存在
  • SQL 参数传递错误或类型不匹配
  • 数据库连接问题

解决方案:在平台的自定义 SQL 管理页面先测试 SQL 是否能正常执行。

如何调试 SQL 查询?

启用 SDK 调试模式:

TypeScript
const client = createClient({
  appCode: "your-app",
  accessKey: process.env.ACCESS_KEY,
  options: {
    debug: true, // 启用调试日志
  },
});

如何处理大数据量?

  1. 在 SQL 中使用 LIMIT
  2. 使用分页参数
  3. 使用后台任务:对于大数据量处理,建议使用定时任务而非实时查询

支持哪些 SQL 操作?

  • SELECT 查询:完全支持
  • ⚠️ UPDATE/DELETE:部分支持(需要管理员权限配置)
  • INSERT:不建议使用(请使用 Dataset API)
  • DDL 操作:不支持(CREATE/DROP TABLE 等)

Backend Function 中的差异

如果你在 Lovrabet 平台的 Backend Function (BFF) 中使用 SQL,返回值结构与前端 SDK 不同:

返回值对比

环境调用方式返回值数据获取方式
前端 SDKclient.sql.execute(){ execSuccess, execResult }需检查 execSuccess,从 execResult 取数据
Backend Functioncontext.client.sql.execute()直接返回数组 [{ col: val }, ...]直接使用结果,无 execResult 字段

Backend Function 用法示例

JavaScript
// BFF 环境中
export default async function myEndpoint(params, context) {
  // 直接返回数组,无需检查 execSuccess
  const rows = await context.client.sql.execute({
    sqlCode: "user-stats",
    params: { userId: params.userId }
  });

  // rows 就是查询结果数组
  return { data: rows };
}

⚠️ 注意区别BFF 中不存在 execResult 字段,以下写法是错误的:

错误处理

前端 SDK:检查 execSuccess 或使用 sqlSafe

TypeScript
const result = await client.sql.execute({ sqlCode: 'xxx' });
if (!result.execSuccess) {
  throw new Error('查询失败');
}

Backend Function:执行失败直接抛异常,用 try-catch 捕获

JavaScript
try {
  const rows = await context.client.sql.execute({ sqlCode: 'xxx' });
  return { data: rows };
} catch (error) {
  throw new Error(`查询失败: ${error.message}`);
}

相关文档

  • 自定义 SQL 使用教程 - 完整的 step by step 教程
  • 快速开始 - SDK 安装和配置
  • 认证方式 - 三种认证模式详解
  • API 使用指南 - Dataset API 参考
  • 故障排查 - 常见问题解决

最后更新:2025-11-12

基于飞书知识库同步生成,内容以飞书源文档为准