access 根据id删除数据_小程序云开发之数据库自动备份丨云开发101

c72057e228cdf261f35602128180258c.png

钻石有价,数据无价。我们通常会把重要的业务数据存放在数据库中,并需要对数据库做定时的自动备份工作,防止数据异常丢失,造成无法挽回的损失。

小程序云开发提供了方便的云数据库供我们直接使用,云开发使用了腾讯云提供的云数据库,拥有完善的数据保障机制,无需担心数据丢失。但是,我们还是不可避免的会担心数据库中数据的安全,比如不小心删除了数据集合,写入了脏数据等。

还好,云开发控制台提供了数据集合的导出,导入功能,我们可以手动备份数据库。不过,总是手动备份数据库也太麻烦了点,所有重复的事情都应该让代码去解决,下面我们就说说怎么搞定云开发数据库自动备份。

通过查阅微信的文档,可以发现云开发提供了数据导出接口databaseMigrateExport

POST https://api.weixin.qq.com/tcb/databasemigrateexport?access_token=ACCESS_TOKEN

通过这个接口,结合云函数的定时触发功能,我们就可以做数据库定时自动备份了。梳理一下大致的流程:

(1)创建一个定时触发的云函数。

(2)云函数调用接口,导出数据库备份文件。

(3)将备份文件上传到云存储中以供使用。

获取 access_token

调用微信的接口需要 accesstoken,所以我们首先要获取 accesstoken。通过文档了解到使用 auth.getAccessToken 接口可以用小程序的 appid 和 secret 获取 access_token。

// 获取 access_token

request.get(

`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}`,

(err, res, body) => {

if (err) {

// 处理错误

return;

}

const data = JSON.parse(body);

// data.access_token

}

);

创建数据库导出任务

获取 access_token 后,就可以使用 databaseMigrateExport 接口导出数据进行备份。

databaseMigrateExport 接口会创建一个数据库导出任务,并返回一个 jobid,这个 jobid 怎么用我们下面再说。显然数据库的数据导出并不是同步的,而是需要一定时间的,数据量越大导出所要花费的时间就越多,个人实测,2W 条记录,2M 大小,导出大概需要 3~5 S。

调用 databaseMigrateExport 接口需要传入环境 Id,存储文件路径,导出文件类型(1 为 JSON,2 为 CSV),以及一个 query 查询语句。

因为我们是做数据库备份,所以这里就导出 JSON 类型的数据,兼容性更好。需要备份的数据可以用 query 来约束,这里还是很灵活的,既可以是整个集合的数据,也可以是指定的部分数据,这里我们就使用 db.collection('data').get() 备份 data 集合的全部数据。同时我们使用当前时间作为文件名,方便以后使用时查找。

request.post(

`https://api.weixin.qq.com/tcb/databasemigrateexport?access_token=${accessToken}`,

{

body: JSON.stringify({

env,

file_path: `${date}.json`,

file_type: '1',

query: 'db.collection("data").get()'

})

},

(err, res, body) => {

if (err) {

// 处理错误

return;

}

const data = JSON.parse(body);

// data.job_id

}

);

查询任务状态,获取文件地址

在创建号数据库导出任务后,我们会得到一个 job_id,如果导出集合比较大,就会花费较长时间,这时我们可以使用 databaseMigrateQueryInfo 接口查询数据库导出的进度。

当导出完成后,会返回一个 file_url,即可以下载数据库导出文件的临时链接。

request.post(

`https://api.weixin.qq.com/tcb/databasemigratequeryinfo?access_token=${accessToken}`,

{

body: JSON.stringify({

env,

job_id: jobId

})

},

(err, res, body) => {

if (err) {

reject(err);

}

const data = JSON.parse(body);

// data.file_url

}

);

获取到文件下载链接之后,我们可以将文件下载下来,存入到自己的云存储中,做备份使用。如果不需要长时间的保留备份,就可以不用下载文件,只需要将 jobid 存储起来,当需要恢复备份的时候,通过 jobid 查询到新的链接,下载数据恢复即可。

至于 job_id 存在哪,就看个人想法了,这里就选择存放在数据库里。

await db.collection('db_back_info').add({

data: {

date: new Date(),

jobId: job_id

}

});

函数定时触发器

云函数支持定时触发器,可以按照设定的时间自动执行。云开发的定时触发器采用的 Cron 表达式语法,最大精度可以做的秒级,详细的使用方法可以参考官方文档:定时触发器 | 微信开放文档

这里我们配置函数每天凌晨 2 点触发,这样就可以每天都对数据库进行备份。在云函数目录下新建 config.json文件,写入如下内容:

{

"triggers": [

{

"name": "dbTrigger",

"type": "timer",

"config": "0 0 2 * * * *"

}

]

}

完整代码

在源码基础上,只需要创建一个定时触发的云函数,并设置好相关的环境变量即可使用:

  • appid

  • secret

  • backupColl:需要备份的集合名称,如 ‘data’

  • backupInfoColl:存储备份信息的集合名称,如 ‘dbbackinfo’

注意,云函数的默认超时时间是 3 秒,创建备份函数时,建议将超时时间设定到最大值 20S,留有足够的时间查询任务结果。

/* eslint-disable */

const request = require('request');

const cloud = require('wx-server-sdk');

// 环境变量

const env = 'xxxx';

cloud.init({

env

});

// 换取 access_token

async function getAccessToken(appid, secret) {

return new Promise((resolve, reject) => {

request.get(

`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}`,

(err, res, body) => {

if (err) {

reject(err);

return;

}

resolve(JSON.parse(body));

}

);

});

}

// 创建导出任务

async function createExportJob(accessToken, collection) {

const date = new Date().toISOString();

return new Promise((resolve, reject) => {

request.post(

`https://api.weixin.qq.com/tcb/databasemigrateexport?access_token=${accessToken}`,

{

body: JSON.stringify({

env,

file_path: `${date}.json`,

file_type: '1',

query: `db.collection("${collection}").get()`

})

},

(err, res, body) => {

if (err) {

reject(err);

}

resolve(JSON.parse(body));

}

);

});

}

// 查询导出任务状态

async function waitJobFinished(accessToken, jobId) {

return new Promise((resolve, reject) => {

// 轮训任务状态

const timer = setInterval(() => {

request.post(

`https://api.weixin.qq.com/tcb/databasemigratequeryinfo?access_token=${accessToken}`,

{

body: JSON.stringify({

env,

job_id: jobId

})

},

(err, res, body) => {

if (err) {

reject(err);

}

const { status, file_url } = JSON.parse(body);

console.log('查询');

if (status === 'success') {

clearInterval(timer);

resolve(file_url);

}

}

);

}, 500);

});

}

exports.main = async (event, context) => {

// 从云函数环境变量中读取 appid 和 secret 以及数据集合

const { appid, secret, backupColl, backupInfoColl } = process.env;

const db = cloud.database();

try {

// 获取 access_token

const { errmsg, access_token } = await getAccessToken(appid, secret);

if (errmsg && errcode !== 0) {

throw new Error(`获取 access_token 失败:${errmsg}` || '获取 access_token 为空');

}

// 导出数据库

const { errmsg: jobErrMsg, errcode: jobErrCode, job_id } = await createExportJob(access_token, backupColl);

// 打印到日志中

console.log(job_id);

if (jobErrCode !== 0) {

throw new Error(`创建数据库备份任务失败:${jobErrMsg}`);

}

// 将任务数据存入数据库

const res = await db.collection('db_back_info').add({

data: {

date: new Date(),

jobId: job_id

}

});

// 等待任务完成

const fileUrl = await waitJobFinished(access_token, job_id);

console.log('导出成功', fileUrl);

// 存储到数据库

await db

.collection(backupInfoColl)

.doc(res._id)

.update({

data: {

fileUrl

}

});

} catch (e) {

throw new Error(`导出数据库异常:${e.message}`);

}

};

海量云开发实

 往期精彩 

点击下方图片即可阅读

6df8d5e471716ba7dbc6226f60be2e15.png

f4390af596ba4d036a922f5a192b89b5.png

97558323d48037a557a99af2ba18bc29.png

8b12df1da807d640947aa6e2cc9a41fe.png

51d73ea580dae0f13970df042e80c1e7.png

云开发 · 不止于「快」

2c167955169a4f818ff9e31c3869529a.png

云开发

Tencent CloudBase

      点击在看让更多人发现精彩e76929db12826c5061b9e0b000f47ab0.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国家职业资格计算机调试维修技师试题,电工国家职业资格三级(高级)理论试题...

电工国家职业资格三级理论试题一、单选题(第1题~第60题。选择一个正确的答案,将相应的字母填入题内的括号中。每题1.0分,满分60分。)1.异步测速发电机的空心杯转子是用( )材料做成的。(A)低电阻 (B)高电阻 (C)低导磁 (D…

PHP解决方案@时间差异计算函数

为什么80%的码农都做不了架构师?>>> 方案解决目标:计算时间差异 function ago($time){ $periods array("second","minute","hour","day","week","month","year",…

baidumap vue 判断范围_vue 数据渲染

本文转载于 SegmentFault 社区社区专栏:山外de楼作者:山外de楼前言 vue 是如何将编译器中的代码转换为页面真实元素的?这个过程涉及到模板编译成 AST 语法树,AST 语法树构建渲染函数,渲染函数生成虚拟 dom,…

jtoken判断是否包含键_Redis 数据库、键过期的实现

今天看看作为内存数据库,Redis 是怎么存储数据的以及键是怎么过期的。阅读这篇文章你将会了解到:Redis 的数据库实现Redis 键过期的策略数据库的实现我们先看代码 server.h/redisServerstruct redisServer{ ... //保存 db 的数组 redisDb *db; //db 的数…

JBoss配置详解

为什么80%的码农都做不了架构师?>>> 2.0.1 JBOSS 的一点说明 $JBOSS-HOME/server/下有3个目录,all/default/minimal,它们是表示3种配置,全部的配置、默认配置、最小配置,我们在启动JBOSS服务时&#xff0c…

简单仿百度自动搜索框

body中 <body> 请输入搜索内容:<input type"text" name"name" value"" id"txt" style"border:1px solid gray;margin:0;padding:0; width:200px;" /></body> View Code<script>中 <script type&…

layui上传文件请求接口异常_SpringMVC实现文件上传与下载,拦截器,异常处理

第一章&#xff1a;响应数据和结果视图1. 返回字符串Controller方法返回字符串可以指定逻辑视图的名称&#xff0c;根据视图解析器为物理视图的地址。RequestMapping(value"/hello")public String sayHello() {System.out.println("Hello SpringMVC!!");//…

球星测试软件,2KOL球星测评丨篮球之神,迈克尔.乔丹(96版)

迈克尔.乔丹(96版)迈克尔乔丹在在1984年NBA选秀中于第1轮第3位被芝加哥公牛队选中。(他的前面两位分别是哈基姆奥拉朱旺和萨姆鲍伊)91-93赛季&#xff0c;乔丹连续2次荣膺常规赛MVP和3次总决赛FMVP &#xff0c;并率领芝加哥公牛队首夺3连冠。 93年10月6日因父亲被害而宣布退役…

iphone无线充电充电测试软件,瞎折腾星人的测评 篇一:想体验iPhone的无线充电?这可能是最具性价比的选择了!...

瞎折腾星人的测评 篇一&#xff1a;想体验iPhone的无线充电&#xff1f;这可能是最具性价比的选择了&#xff01;2018-11-28 00:26:032点赞2收藏0评论最近恰逢更换新手机&#x1f4f1;iPhone XS Max的重大活动&#xff0c;功臣iPhone 7退居二线&#xff0c;女票突然脑子一热要给…

MVC5+EF6 入门完整教程四

MVC5EF6 入门完整教程四 原文:MVC5EF6 入门完整教程四上篇文章主要讲了如何配置EF, 我们回顾下主要过程&#xff1a; 创建Data Model 创建Database Context 创建databaseInitializer配置entityFramework的context配置节。 对这个过程还有疑问的可以去上篇再看一下。 本次我…

android js调试

http://blog.allenm.me/ 其他平台去这篇文章看 1 //js调试调试功能支持4.4版本以上的2 if(Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {3 WebView.setWebContentsDebuggingEnabled(true);4 }5 //j…

python 比赛成绩预测_利用 Python 预测英雄联盟胜负,分析了 5 万多场比赛才得出的数据!值得,涨知识了!...

Mika 来源 | 头图 |CSDN自东方IC今天教大家用Python预测英雄联盟比赛胜负。Show me data&#xff0c;用数据说话今天我们聊一聊 Python预测LOL胜负目前&#xff0c;英雄联盟S10全球总决赛正在火热进行中&#xff0c;最终决赛于10月31日在浦东足球场举行。作为当下最火热的电竞赛…

服务器2003蓝屏A5修复,0x000000a5蓝屏完美解决方法 Win7

0x000000a5蓝屏怎么办&#xff1f;在Win7系统下遭遇开机时出现蓝屏代码0x000000a5非常多&#xff0c;由于根据代码我们并不能分析出故障原因&#xff0c;那么只能求助于网络上大家分享的经验了&#xff0c;下面小编给大家分享下0x000000a5蓝屏完美解决方法&#xff0c;适用于Wi…

能设值多个rowkey吗_顶楼送了露台,悄悄搭建阳光房,偏偏我家露台多个帽子,能拆吗?...

你们有没有发现现在楼顶上都会有几个这样的“帽子"&#xff0c;呼呼直转&#xff0c;但大多数人并不是很明白这个东西是干嘛用的。昨天有网友私信&#xff1a;小区顶楼露台上这个不锈钢帽子可以加高吗&#xff1f;感觉每次去楼顶都会闻到一股油烟味。业主表示自己是住在顶…

金山云服务器内网带宽,金山云-文档中心-配置弹性网卡

本文为您介绍绑定弹性网卡后虚机中如何配置弹性网卡。挂载辅网卡后&#xff0c;Windows操作系统主机即可正常使用&#xff0c;不需要额外操作。如果实例使用以下几种镜像&#xff0c;则可以跳过网卡手动配置&#xff0c;直接进行路由配置。CentOS 7.6 64位CentOS 7.7 64位CentO…

Atom飞行手册翻译: 2.7 ~ 2.10

自动补全 如果你仍旧希望节约一些打字时间&#xff0c;Atom自带简单的自动补全功能。 通过使用ctrl-space&#xff0c;自动补全工具可以让你看到并插入可选的完整单词。 通常&#xff0c;自动补全工具会浏览当前打开的整个文档&#xff0c;寻找匹配你开始打出来的单词。 如果你…

Flash游戏开发实战(一)

我不得不承认&#xff0c;我不是植物大战僵尸的骨灰玩家&#xff0c;所以&#xff0c;如果你发现这个系列的教程有什么地方错误的&#xff0c;请告诉我。 定义游戏的主要结构 植物大战僵给了我们很好的视觉和感觉上的享受。你得保护你的房子以免被吃脑的僵尸入侵&#xff0c;这…

如何做相册_手机里的照片太多,不得已只能删除?那就试试制作电子相册吧

许多人都喜欢使用手机拍照&#xff0c;这也就导致自己手机相册中保存的照片越来越多&#xff0c;到后面想要再拍照片的话&#xff0c;就不得不删除之前的照片&#xff0c;如何解决这个办法呢&#xff1f;那就试试用【迅捷视频转换器】将其制作成电子相册吧。制作电子相册打开软…

python windows窗口置顶_想用Python编程却不知如何下手?一篇搞定编程准备工作

导读&#xff1a;为了简化Python编程的学习难度&#xff0c;开发过程中的工具、环境尽量使用同一套&#xff0c;此后所有的编程环境都以Windows系统下Python3.8为准&#xff0c;代码编辑器及IDE(集成开发环境)使用VS Code。目的很简单&#xff0c;就是为了让所有的讲解和学习集…

小程序 ajax 加载,小程序实战-小程序网络请求异步加载

最初看到小程序的网络请求的时候,尤其是演示示例中&#xff0c;userInfoReadyCallback这个函数更是一头雾水。其实并不怎么理解.一直很费解.网上各路大侠都有解释&#xff0c;但是就是&#xff0c;不知道是怎么个顺序,而我也是个对程序执行流程很关注的人,现在把我的心得分享给…