cap-apps-sql-query
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinese@domoinc/toolkit - SqlClient
@domoinc/toolkit - SqlClient
When to use this skill
何时使用该技能
Apply when executing SQL queries against Domo datasets, using AI-generated SQL from , or any time you need to run raw SQL against a dataset alias. Use from instead of .
AIClient.text_to_sqlSqlClient@domoinc/toolkitdomo.post('/sql/v1/')当你需要针对Domo数据集执行SQL查询、使用生成的AI SQL,或者任何需要针对数据集别名执行原生SQL的场景时,都可以使用该技能。请使用中的,而非。
AIClient.text_to_sql@domoinc/toolkitSqlClientdomo.post('/sql/v1/')Overview
概述
SqlClientmanifest.jsonSqlClientmanifest.jsonImport and instantiation
导入与实例化
typescript
import { SqlClient } from '@domoinc/toolkit';
const sqlClient = new SqlClient();typescript
import { SqlClient } from '@domoinc/toolkit';
const sqlClient = new SqlClient();Methods
方法
get(alias, query)
get(alias, query)get(alias, query)
get(alias, query)Executes a SQL query against a dataset.
typescript
const result = await sqlClient.get('datasetAlias', 'SELECT * FROM datasetAlias');Parameters:
- (
alias): dataset alias fromstringmappingsmanifest.json - (
query): SQL query stringstring
Returns:
Promise<Response<SqlResponse>>针对数据集执行SQL查询。
typescript
const result = await sqlClient.get('datasetAlias', 'SELECT * FROM datasetAlias');参数:
- (
alias类型):来自string映射的数据集别名manifest.json - (
query类型):SQL查询字符串string
返回值:
Promise<Response<SqlResponse>>parsePageFilters(datasets, produceClauses?)
parsePageFilters(datasets, produceClauses?)parsePageFilters(datasets, produceClauses?)
parsePageFilters(datasets, produceClauses?)Transforms Domo page filters into SQL predicates.
typescript
// Get predicates as objects
const predicates = sqlClient.parsePageFilters(['datasetAlias']);
// Get predicates as WHERE/HAVING clause strings
const clauses = sqlClient.parsePageFilters(['datasetAlias'], true);将Domo页面过滤器转换为SQL谓词。
typescript
// 获取对象形式的谓词
const predicates = sqlClient.parsePageFilters(['datasetAlias']);
// 获取WHERE/HAVING子句字符串形式的谓词
const clauses = sqlClient.parsePageFilters(['datasetAlias'], true);Response format
响应格式
CRITICAL: SQL API returns a columnar format, not an array of row objects.
typescript
// Response shape:
{
columns: ['vendor', 'Total Spend'],
rows: [
['Sysco Utah', 1880794.74],
['Intermountain Meats', 809389.15]
],
metadata: [...],
numRows: 8,
numColumns: 2,
datasource: 'dataset-uuid',
fromcache: true
}You must zip + into objects for UI rendering:
columnsrowstypescript
const result = await sqlClient.get('myAlias', sql);
const res = result?.body || result?.data || result;
const colNames: string[] = res?.columns || [];
const rawRows: unknown[][] = res?.rows || [];
const rows = rawRows.map((row) => {
const obj: Record<string, unknown> = {};
colNames.forEach((col, i) => {
obj[col] = row[i];
});
return obj;
});
// rows => [{ vendor: 'Sysco Utah', 'Total Spend': 1880794.74 }, ...]重要提示:SQL API返回的是列格式数据,而非行对象数组。
typescript
// 响应结构:
{
columns: ['vendor', 'Total Spend'],
rows: [
['Sysco Utah', 1880794.74],
['Intermountain Meats', 809389.15]
],
metadata: [...],
numRows: 8,
numColumns: 2,
datasource: 'dataset-uuid',
fromcache: true
}你需要将和合并为对象,以便用于UI渲染:
columnsrowstypescript
const result = await sqlClient.get('myAlias', sql);
const res = result?.body || result?.data || result;
const colNames: string[] = res?.columns || [];
const rawRows: unknown[][] = res?.rows || [];
const rows = rawRows.map((row) => {
const obj: Record<string, unknown> = {};
colNames.forEach((col, i) => {
obj[col] = row[i];
});
return obj;
});
// rows => [{ vendor: 'Sysco Utah', 'Total Spend': 1880794.74 }, ...]Common pattern: AI text-to-SQL + SqlClient
常见模式:AI文本转SQL + SqlClient
Use to generate SQL, then to execute it:
AIClientSqlClienttypescript
import { AIClient, SqlClient } from '@domoinc/toolkit';
// 1) Generate SQL from natural language
const aiResponse = await AIClient.text_to_sql(question, [
{
dataSourceName: 'myAlias',
description: 'Description of the dataset',
columns: [
{ name: 'vendor', type: 'string' },
{ name: 'amount', type: 'number' }
]
}
]);
const responseBody = aiResponse.data || aiResponse.body || aiResponse;
const sql = responseBody.output || responseBody.choices?.[0]?.output;
// 2) Execute SQL
const sqlClient = new SqlClient();
const result = await sqlClient.get('myAlias', sql);
// 3) Parse columnar response into row objects
const res = result?.body || result?.data || result;
const colNames: string[] = res?.columns || [];
const rawRows: unknown[][] = res?.rows || [];
const rows = rawRows.map((row) => {
const obj: Record<string, unknown> = {};
colNames.forEach((col, i) => {
obj[col] = row[i];
});
return obj;
});使用生成SQL,再用执行:
AIClientSqlClienttypescript
import { AIClient, SqlClient } from '@domoinc/toolkit';
// 1) 从自然语言生成SQL
const aiResponse = await AIClient.text_to_sql(question, [
{
dataSourceName: 'myAlias',
description: 'Description of the dataset',
columns: [
{ name: 'vendor', type: 'string' },
{ name: 'amount', type: 'number' }
]
}
]);
const responseBody = aiResponse.data || aiResponse.body || aiResponse;
const sql = responseBody.output || responseBody.choices?.[0]?.output;
// 2) 执行SQL
const sqlClient = new SqlClient();
const result = await sqlClient.get('myAlias', sql);
// 3) 将列格式响应解析为行对象
const res = result?.body || result?.data || result;
const colNames: string[] = res?.columns || [];
const rawRows: unknown[][] = res?.rows || [];
const rows = rawRows.map((row) => {
const obj: Record<string, unknown> = {};
colNames.forEach((col, i) => {
obj[col] = row[i];
});
return obj;
});Important notes
重要注意事项
- Use instead of
SqlClient.domo.post('/sql/v1/') - SQL endpoint ignores page filters; use to inject filters manually when needed.
parsePageFilters() - Dataset alias in SQL must match manifest alias (example:
FROM).SELECT * FROM vendorPayments - Response is always columnar (+
columns), never a flat array of objects.rows - Response may be in ,
.body, or directly on result; parse defensively..data
- 请使用而非
SqlClient。domo.post('/sql/v1/') - SQL端点会忽略页面过滤器;如果需要,可使用手动注入过滤器。
parsePageFilters() - SQL语句子句中的数据集别名必须与manifest中的别名匹配(例如:
FROM)。SELECT * FROM vendorPayments - 响应始终为列格式(+
columns),绝不会是扁平化的对象数组。rows - 响应数据可能存储在、
.body或直接在结果对象上;请进行防御性解析。.data