查询数据
初始化 SDK
import cloudbase from "@cloudbase/node-sdk";
const app = cloudbase.init({
env: "your-env-id", // 替换为您的环境id
});
const db = app.rdb();
// 或指定实例和数据库
// const db = app.rdb({
// instance: "<instance>",
// database: "<database>"
// });
基础查询
通过 select() 方法查询表数据,支持条件筛选、关联查询等功能。
db.from(tableName).select(columns, options)
- tableName:表名称
- columns:要检索的列,用逗号分隔
- options:查询选项配置
参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| columns | string | 否 | 要检索的列,用逗号分隔。返回时可以使用 customName:aliasName 重命名列 |
| options | object | 否 | 查询选项配置 |
options 参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| count | string | 否 | 计数算法,可选值:"exact" - 底层执行 COUNT(*) |
| head | boolean | 否 | 设置为 true 时不返回数据,仅在需要计数时有用 |
代码示例
查询所有数据
// 查询 articles 表中的所有数据
const { data, error } = await db.from("articles").select();
console.log('查询结果:', data);
查询指定列
// 只查询文章的标题和创建时间
const { data, error } = await db.from("articles").select("title, created_at");
console.log('查询结果:', data);
返回结果
{
data: [
{
id: 1,
title: "文章标题",
created_at: "2023-01-01T00:00:00Z"
},
// ... 其他记录
],
error: null
}
关联表查询
通过关联查询可以同时获取多个表的数据,支持一对一、一对多等关联关系。
示例表结构
为了更好地理解关联查询,我们先了解一下示例中使用的表结构:
表关系说明:
articles表通过category_id与categories表建立多对一关系articles表通过created_by与users表建立多对一关系(创建者)articles表通过updated_by与users表建立多对一关系(修改者)
查看完整的 SQL 建表语句
-- 用户表
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(100)
);
-- 分类表
CREATE TABLE categories (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100)
);
-- 文章表
CREATE TABLE articles (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(256),
content TEXT,
category_id VARCHAR(256),
created_by VARCHAR(256),
updated_by VARCHAR(256),
created_at TIMESTAMP,
updated_at TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES categories(id),
CONSTRAINT articles_created_by_fkey FOREIGN KEY (created_by) REFERENCES users(id),
CONSTRAINT articles_updated_by_fkey FOREIGN KEY (updated_by) REFERENCES users(id)
);
基础关联查询
// 查询文章数据,同时获取关联的分类信息
// 基于 articles.category_id = categories.id 的关联关系
const { data, error } = await db.from("articles").select(`
title,
categories(name)
`);
console.log('查询结果:', data);
查看返回结果示例
[
{
title: "JavaScript 入门教程",
categories: {
name: "前端开发"
}
},
{
title: "Node.js 实战",
categories: {
name: "后端开发"
}
}
]
多重关联查询
// 查询文章,同时获取创建者和修改者的信息
// 需要指定外键约束名来区分不同的关联关系
const { data, error } = await db.from("articles").select(`
title,
created_by:users!articles_created_by_fkey(name),
updated_by:users!articles_updated_by_fkey(name)
`);
console.log('查询结果:', data);
查看返回结果示例
[
{
title: "JavaScript 入门教程",
created_by: {
name: "张三"
},
updated_by: {
name: "李四"
}
}
]
💡 注意:当同一个表通过不同的外键关联多次时,需要使用外键约束名来区分不同的关联关系。在示例中,
articles_created_by_fkey和articles_updated_by_fkey是数据库中定义的外键约束名。
嵌套关联查询
// 查询分类及其下的所有文章,以及文章的作者信息
// 这是一个三层嵌套的关联查询:categories -> articles -> users
const { data, error } = await db.from("categories").select(`
name,
articles (
title,
users (
name
)
)
`);
console.log('查询结果:', data);
查看返回结果示例
[
{
name: "前端开发",
articles: [
{
title: "JavaScript 入门教程",
users: {
name: "张三"
}
},
{
title: "Vue.js 实战",
users: {
name: "李四"
}
}
]
},
{
name: "后端开发",
articles: [
{
title: "Node.js 实战",
users: {
name: "王五"
}
}
]
}
]
高级查询
条件过滤查询
// 查询特定分类下的所有文章
// 通过分类名称过滤,获取该分类下的所有文章
const { data, error } = await db
.from("articles")
.select("title, categories(*)")
.eq("categories.name", "技术文章");
console.log('查询结果:', data);
查看返回结果示例
[
{
title: "JavaScript 高级特性",
categories: {
id: 1,
name: "技术文章"
}
},
{
title: "数据库优化技巧",
categories: {
id: 1,
name: "技术文章"
}
}
]
计数查询
// 获取每个分类及其包含的文章数量
// count 会统计每个分类下有多少篇文章
const { data, error } = await db
.from("categories")
.select(`*, articles(count)`);
console.log('查询结果:', data);
查看返回结果示例
[
{
id: 1,
name: "前端开发",
articles: [
{ count: 5 } // 该分类下有5篇文章
]
},
{
id: 2,
name: "后端开发",
articles: [
{ count: 3 } // 该分类下有3篇文章
]
}
]
仅获取总数
// 只获取文章总数,不返回具体数据
const { count, error } = await db
.from("articles")
.select("*", { count: "exact", head: true });
console.log('总数:', count);
内连接查询
// 只获取有分类的文章,使用内连接确保分类存在
// !inner 确保只返回在 categories 表中有匹配记录的文章
const { data, error } = await db
.from("articles")
.select("title, categories!inner(name)")
.eq("categories.name", "教程")
.limit(10);
console.log('查询结果:', data);
查看返回结果示例
[
{
title: "JavaScript 基础教程",
categories: {
name: "教程"
}
},
{
title: "React 入门教程",
categories: {
name: "教程"
}
}
]
💡 注意:
!inner表示内连接,只返回那些在关联表中存在匹配记录的数据。如果不使用!inner,即使文章的category_id为 null 或指向不存在的分类,文章仍会被返回,但categories字段为 null。