关系型数据库(PostgreSQL)
自 @cloudbase/manager-node@5.4.0 起新增此模块。通过 app.database 访问,提供在 PostgreSQL 架构的云开发环境上执行 SQL 语句及管理数据的能力。
初始化
import CloudBase from '@cloudbase/manager-node'
const app = CloudBase.init({
secretId: 'Your SecretId',
secretKey: 'Your SecretKey',
envId: 'Your envId'
})
const { database } = app
executePGSql
1. 接口描述
接口功能:在 PostgreSQL 环境上执行任意 SQL 语句(DDL / DML / DQL 等),并返回结果集与受影响行数。
接口声明:app.database.executePGSql(options): Promise<IExecutePGSqlResult>
2. 输入参数
IExecutePGSqlOptions
| 字段 | 必填 | 类型 | 说明 |
|---|---|---|---|
| Sql | 是 | String | 要执行的 SQL 语句 |
| Role | 否 | String | 指定 role 执行 SQL,可传任意有效的 role(包括用户自定义 role)。云开发内置了 cloudbase_read_only_user 只读角色,使用该角色执行 SQL 可避免非预期的写操作执行成功 |
| EnvId | 否 | String | 云开发环境 ID,不传则使用当前管理实例初始化时的 EnvId |
3. 返回结果
IExecutePGSqlResult
| 字段 | 类型 | 说明 |
|---|---|---|
| RequestId | String | 请求唯一标识 |
| AffectedRows | Number | 受影响行数(DML 类语句有效) |
| Columns | String[] / null | 字段名列表(SELECT 类语句返回);无结果集时为 null |
| Rows | String[] / null | 数据行列表,每一项是 JSON 串,反序列化后是 (string | null)[],按 Columns 顺序对齐;无结果集时为 null |
| ExecutionTimeMs | Number | SQL 执行耗时(毫秒) |
4. 示例代码
// 创建表
await database.executePGSql({
Sql: 'CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE)'
})
// 插入数据
const insertRes = await database.executePGSql({
Sql: "INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com')"
})
console.log('受影响行数:', insertRes.AffectedRows) // 1
// 查询并解析结果
const res = await database.executePGSql({
Sql: 'SELECT id, name, email FROM users WHERE id = 1'
})
console.log(res.Columns) // ['id', 'name', 'email']
const rows = (res.Rows || []).map(s => JSON.parse(s))
// rows: [['1', 'Alice', 'alice@example.com']]
// 使用云开发内置的只读 role 执行查询,避免非预期的写操作执行成功
const readonlyRes = await database.executePGSql({
Role: 'cloudbase_read_only_user',
Sql: 'SELECT id, name, email FROM users'
})
console.log(readonlyRes.Rows)
// 指定其他环境 ID 执行
await database.executePGSql({
EnvId: 'other-env-id',
Sql: 'SELECT NOW()'
})
数据库迁移(Migrations)
自 @cloudbase/manager-node@5.6.5 起新增以下数据库迁移相关方法,用于在 PostgreSQL 架构的云开发环境中,以“版本化 SQL 脚本”的方式管理表结构与数据变更。
概念说明
- Migration(迁移):一次带有版本号的 SQL 变更,包含
Version、Name、Query。Version:14 位数字时间串,例如20260526000000。建议使用发生时间(YYYYMMDDHHMMSS)保证全局有序、唯一。Name:仅允许小写字母和下划线,如create_users_table。Query:本次要执行的 SQL。
cloudbase_migrations.schema_migrations:云开发在目标 PG 环境中维护的迁移历史表,记录已成功应用的 migration。- 典型流程:
- 用
previewPGUserMigrations预览计划、检查 checksum 冲突。 - 无冲突后调用
pushPGUserMigrations,得到TaskId。 - 通过
describeTaskResult轮询任务状态直至Succeed/Failed。 - 需要时用
listPGUserMigrations/listAllPGUserMigrations/describePGUserMigration查询已应用记录。 - 出现历史与实际不一致时,用
repairPGUserMigrationHistory仅修复 history 记录(不执行 SQL)。
- 用
previewPGUserMigrations
1. 接口描述
接口功能:预览一批用户 migration 的远端执行计划(不实际执行 SQL),并返回 Pending(待执行)、Applied(已应用)、Conflicts(checksum 冲突)、Executable(是否可直接执行)。
接口声明:app.database.previewPGUserMigrations(options): Promise<IPreviewPGUserMigrationsResult>
2. 输入参数
IPreviewPGUserMigrationsOptions
| 字段 | 必填 | 类型 | 说明 |
|---|---|---|---|
| EnvId | 否 | String | 云开发环境 ID,不传则使用管理实例初始化时的 EnvId |
| Migrations | 是 | IPGUserMigrationInput[] | migration 列表,至少 1 条;每条需通过下方入参校验 |
| IncludeAll | 否 | Boolean | 是否允许 out-of-order 本地 migration(在已应用版本之前插入新版本),默认 false |
IPGUserMigrationInput
| 字段 | 必填 | 类型 | 说明 |
|---|---|---|---|
| Version | 是 | String | migration 版本,14 位数字时间串(如 20260526000000) |
| Name | 是 | String | migration 名称,仅允许小写字母和下划线 |
| Query | 是 | String | 要执行的 SQL,不能为空字符串 |
3. 返回结果
IPreviewPGUserMigrationsResult
| 字段 | 类型 | 说明 |
|---|---|---|
| Pending | IPGUserMigrationPlanItem[] | null | 将要执行的 migration 列表 |
| Applied | IPGUserMigrationPlanItem[] | null | 已经应用过的 migration 列表 |
| Conflicts | IPGUserMigrationConflict[] | null | 冲突列表:版本号相同但 checksum 不一致的 migration,非空即表示本地 SQL 与已应用记录不一致 |
| Executable | Boolean | 是否可直接执行(当前主要表示无 checksum 冲突) |
| RequestId | String | 请求唯一标识 |
IPGUserMigrationPlanItem 主要字段:Version、Name、Status(如 applied / pending)、Reason(如 checksum_matched)、Checksum、Source。
IPGUserMigrationConflict 主要字段:Version、Name、RemoteName、LocalChecksum、RemoteChecksum、Reason(如 checksum_mismatch)、Message。
4. 示例代码
const preview = await database.previewPGUserMigrations({
Migrations: [
{
Version: '20260526000000',
Name: 'create_users_table',
Query:
'CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name TEXT NOT NULL);'
}
]
})
if (!preview.Executable || (preview.Conflicts || []).length > 0) {
console.error('存在 checksum 冲突,需要处理:', preview.Conflicts)
return
}
console.log('待执行:', preview.Pending)
console.log('已应用:', preview.Applied)
pushPGUserMigrations
1. 接口描述
接口功能:批量应用一组用户 migration。该接口是异步任务,成功调用后返回 TaskId,需要用 describeTaskResult 查询最终结果。
接口声明:app.database.pushPGUserMigrations(options): Promise<IPushPGUserMigrationsResult>
2. 输入参数
IPushPGUserMigrationsOptions
| 字段 | 必填 | 类型 | 说明 |
|---|---|---|---|
| EnvId | 否 | String | 云开发环境 ID,不传则使用管理实例初始化时的 EnvId |
| Migrations | 是 | IPGUserMigrationInput[] | migration 列表,至少 1 条;字段校验规则同 previewPGUserMigrations |
| LockTimeoutMs | 否 | Number | 获取数据库锁的最长等待时间(毫秒),不能小于 0,默认 5000 |
| StatementTimeoutMs | 否 | Number | 单条 SQL 最长执行时间(毫秒),不能小于 0,默认 300000 |
| IncludeAll | 否 | Boolean | 是否允许 out-of-order 本地 migration,默认 false |
3. 返回结果
IPushPGUserMigrationsResult
| 字段 | 类型 | 说明 |
|---|---|---|
| RequestId | String | 请求唯一标识 |
| TaskId | String | 异步任务 ID,可用于查询任务进度与状态 |