å ³ç³»åæ°æ®åºï¼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ï¼å¯ç¨äºæ¥è¯¢ä»»å¡è¿åº¦ä¸ç¶æ |