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,…

spring+websocket综合(springMVC+spring+MyBatis这是SSM框架和websocket集成技术)

java-websocket该建筑是easy。儿童无用的框架可以在这里下载主线和个人教学好java-websocket计划: Apach Tomcat 8.0.3MyEclipsemavenJDK1.7: http://download.csdn.net/detail/up19910522/7719087 spring4.0以后增加了对websocket技术的支持&#xff0c…

电子计算机可直接执行的指令机器内部是以,电子计算机可直接执行的指令在机器内部是以( )表示....

问题:电子计算机可直接执行的指令在机器内部是以( )表示.更多相关问题实际GDP衡量的是在特定年度内生产的最终产品与服务的价值,使用________。A.基年价格B.当年价格C.岗位评价结果的形式多种多样,但最值得…

Audit(查看审核/审计信息)

2013需要到 网站集管理-网站集审核设置 中设置要开启的审核项,开启之后sharepoint才会记录信息,信息存储在contentDB的AuditData中; 去读审计信息的sharepoint代码如下: 1 using (SPSite site new SPSite(SiteUrl))2 {3 usin…

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…

计算机等级考试2010,2010年全国计算机等级考试相关政策

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼二级QBASIC 21 120 60二级FORTRAN 22 120 60 不接受新考生报名二级C 24 120 60二级FOXBASE 25 120 60二级VB 26 90 90二级VFP 27 90 90三级PC技术 33 120 60三级信息管理技术 34 120 60三级网络技术 35 120 60三级数据库技术 36 12…

ACE(Adaptive Communication Environment)介绍

转自 http://blog.csdn.net/huangyong19870618/article/details/4954512 Adaptive Communication Environment(自适配通信环境),简称ACE。为一个以C的Template技术所做成的开放源代码的可跨平台的网络应用程序的程序库套件。 相关书籍   T…

rpn产生proposals_一文读懂RPN和ROI Align

rpn和roi align是two-stage detector中比较关键的两个操作,这两个操作将two-stage detector中的两个stage连接起来,变成end-to-end(端到端)的网络,同时也给整个检测方法的性能带来提升。rpn为roi align提供高质量的候选框,即propo…

多个相同参数表单提交

前情提要: 现在需要使用异步提交表单数据(QueryString方式),但数据个数比较多,一个个拼接比较麻烦,这时可以使用jQuery的方法$("form").serialize()对表单进行序列化。但是如果这时&#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;女票突然脑子一热要给…

Gson读写JSON 数据

一、创建实体&#xff1b; package com.bo.entity;public class ShiTiInFo {private String shitia; //试题名称private String shitib; //大题名称private String shitic; //小题名称private String shitid; //试题题号private int shitie; //试题小号public String getShitia…

poj 2431

大意&#xff1a; 有n个加油点&#xff0c;给出每个加油点距离终点的位置和能加多少油&#xff0c;最后一行给出总长度和最初的油量。求最少加几次油能到终点&#xff0c;不能到的话输出-1. Sample Input 4 4 4 5 2 11 5 15 10 25 10Sample Output 2分析&#xff1a; 一开始打算…

cts游戏手机版_cts游戏

cts游戏是一款非常逼真的驾驶模拟游戏&#xff0c;它以经典的驾驶和运输为主题&#xff0c;通往不同城市拥有不同的运输路线玩家们可以在驾驶过程中欣赏风景&#xff0c;感受全新的天气变化&#xff0c;当天气不好会影响驾驶&#xff0c;玩家需要小心驾驶。确保货物安全发送到指…

服务器系统server 2008,windows server 2008 R2 操作系统

您好&#xff0c;您的问题解决了吗&#xff1f;如果回复对您有所帮助&#xff0c;请记住将其标记为答案。如果否&#xff0c;请回复并告诉我们当前情况&#xff0c;以便提供进一步的帮助。Best regard,SylviaPlease remember to mark the replies as answers if they help. &qu…