描述:

migrate-mongo是一个js模块,通过migrate-mongo可以实现远程操作mongodb数据库。其中执行脚本的版本控制是通过配置文件进行远程MongoDB数据库连接配置,执行时在远程数据库下创建一个默认changelog集合,将执行文件记录存储下来。

环境准备

服务端:

  • MongoDB副本集 - 为migrate-mongo提供MongoDB数据库支持,【副本集】提供migrate-mongo事务支持

客户端:

  • node环境 - 为migrate-mongo提供执行环境

基本用法

这里粗略写了一下,具体可以见最后详情链接

  • 初始化新项目

# 创建工作目录,并在目录下执行初始化
$ mkdir albums-migrations
$ cd albums-migrations
$ migrate-mongo init

上面的初始化命令做了两件事:

  1. 创建了一个migrate-mongo-config.js文件 (该文件用于连接MongoDB数据库相关配置)

  2. 创建了一个migrations文件夹 (该文件夹用于存储执行脚本文件)

  • 链接配置及配置信息加密

migrate-mongo-config.js文件配置详情

migrate-mongo-config.js文件为配置远程mongodb数据库的连接配置文件。编辑migrate-mongo-config.js文件,确保urldatabaseName正确配置。

// 在这个文件中,您可以配置migrate-mongo
​
module.exports = {mongodb: {// MongoDB地址: url: "mongodb://localhost:27017",
​// MongoDB数据库名称:databaseName: "YOURDATABASENAME",
​options: {useNewUrlParser: true // 连接时删除弃用警告//   connectTimeoutMS: 3600000, // 将连接超时时间设置为1小时//   socketTimeoutMS: 3600000, // 将套接字超时时间增加到1小时}},
​// 迁移目录可以是相对路径或绝对路径。仅在确实需要时编辑此内容。migrationsDir: "migrations",
​// 存储应用的更改的mongodb集合。仅在确实需要时编辑此内容。changelogCollectionName: "changelog",
​// 在迁移目录中创建迁移和搜索的文件扩展名migrationFileExtension: ".js",
​// 启用算法以创建文件内容的校验和,并在比较中使用该校验和来确定// useFileHash设置为false,migrations下执行文件被执行后,变更文件内容执行将不发生变化。为true,执行将更新useFileHash: false
};

配置信息加密实现

实际使用过程中我们一般会对敏感属性不能直接暴露出来,需要做加密处理。migrate-mongo目前自身未提供对配置文件加密功能。实现方案: 通过crypto-js依赖实现对url配置信息进行加密,重写migrate-mongo,在加载属性时进行解密。

加密url示例

首先下载用于加密的依赖:npm install crypto-js

然后创建一个js文件,填充以下内容:

var CryptoJS = require("crypto-js");
// Encrypt
var ciphertext = CryptoJS.AES.encrypt("mongodb://user:passwd@101.32.14.131:8080/mongo", 'secret key 123').toString();
console.log(ciphertext);

执行node xx.js即可在屏幕上获取到输出的加密内容

重写migrate-mongo属性加载部分代码 database.js:

$ vi /usr/local/lib/node_modules/migrate-mongo/lib/env/database.js
const { MongoClient } = require("mongodb");
const _ = require("lodash");
const config = require("./config");
var CryptoJS = require("crypto-js");        // crypto-js依赖引入
​
module.exports = {async connect() {const configContent = await config.read();//const url = _.get(configContent, "mongodb.url");let url = _.get(configContent, "mongodb.url");             // 对加密url进行解密处理var bytes  = CryptoJS.AES.decrypt(url, 'secret key 123');  // 对加密url进行解密处理url = bytes.toString(CryptoJS.enc.Utf8);                   // 对加密url进行解密处理const databaseName = _.get(configContent, "mongodb.databaseName");const options = _.get(configContent, "mongodb.options");
  • 执行脚本创建及编排

执行脚本创建

$ cd albums-migrations
$ migrate-mongo create [description]

For example:

$ migrate-mongo create blacklist_the_beatles

创建: migrations/20221010111912-blacklist_the_beatles.js

执行脚本编辑

脚本详情

up部分写入执行脚本,down部分写入回退脚本

module.exports = {async up(db, client) {// TODO write your migration here.// See https://github.com/seppevs/migrate-mongo/#creating-a-new-migration-script// Example:// return db.collection('albums').updateOne({artist: 'The Beatles'}, {$set: {blacklisted: true}});// await db.collection('albums').updateOne({artist: 'The Beatles'}, {$set: {blacklisted: true}});},
​async down(db, client) {// TODO write the statements to rollback your migration (if possible)// Example:// await db.collection('albums').updateOne({artist: 'The Beatles'}, {$set: {blacklisted: false}});}
};
  • 执行、回退操作

执行

执行migrations目录下所有未被执行的.js脚本文件

$ migrate-mongo up

回退

每次回退只会向上回退一次记录(最近一个.js脚本文件)

$ migrate-mongo down

  • 事务实现

官方文档里面没有加session,执行发现不能实现事务提交。看了官方文档,发现加session,试了一下成了。

module.exports = {async up(db, client) {const session = client.startSession();try {await session.withTransaction(async () => {await db.collection('mongo').updateOne({artist: 'The Beatles'}, {$set: {blacklisted: true}}, { session });await db.collection('mongo').updateOne1({artist: 'The Doors'}, {$set: {stars: 5}}, { session });});} finally {await session.endSession();}},
​async down(db, client) {const session = client.startSession();try {await session.withTransaction(async () => {await db.collection('albums').updateOne({artist: 'The Beatles'}, {$set: {blacklisted: false}}, { session });await db.collection('albums').updateOne({artist: 'The Doors'}, {$set: {stars: 0}}, { session });});} finally {await session.endSession();}},
};

相关链接:

GitHub - seppevs/migrate-mongo: A database migration tool for MongoDB in Node

Class: MongoClient

Transactions — MongoDB Manual

migrate-mongo实现对mongo数据库执行脚本版本控制相关推荐

  1. Go web 开发数据库管理平台,利用远程过程调用(RPC)实现对MySQL数据库的管理和使用

    Go web 开发数据库管理平台,利用远程过程调用(RPC)实现对MySQL数据库的管理和使用 前言 做DBA,最基本的工作就是需要管理公司的数据库系统.工作中,常常需要维护的数据库数量是非常多的.小 ...

  2. Qt实战案例(28)——利用QSQL相关类实现对MySQL数据库的基本操作及相关设置详解

    目录 一.项目介绍 二.项目基本配置 2.1 安装MySQL 2.2 创建Qt项目 2.3 移动libmysql.dll文件 三.UI界面设计 四.主程序实现 4.1 pro文件 4.2 main.c ...

  3. oracle执行命令显示2,oracle数据库执行脚本时常用命令总结

    收集了一篇oracle数据库执行脚本常用命令总结,希望给同学带来一些帮助. 1. 执行一个SQL脚本文件 代码如下 sqlplus user/pass@servicenamefile_name.sql ...

  4. postgres数据库执行脚本时,错误ERROR: unterminated quoted string at or near处理

    远程连接postgres数据库,通过psql执行执行SQL脚本 命令如下: psql -h 10.201.83.202 -p 15432 -U postgres -d fruit_tp -a -f f ...

  5. oracle执行命令显示2,Oracle数据库执行脚本常用命令小结

    1. 执行一个SQL脚本文件 复制代码 代码如下: sqlplus user/pass@servicename 或 复制代码 代码如下: SQL>start file_names 或 复制代码 ...

  6. zabbix实现对mysql数据库主从监控

    1.主从关系建立 配置mysql-master端: 1)修改mysql-master的配置文件 [root@localhost ~]# vim /etc/my.cnf [mysqld] server_ ...

  7. oracle cronb,利用Crontab实现对Oracle数据库的定时备份

    假设数据库的拥有者为oracle,数据库的用户为scott,其口令为trigger, Oracle数据库的参数$ORACLE_HOME为/usr/oracle,$ORACLE_SID为oracle1, ...

  8. 实现对mysql增删改查_Java语言实现对MySql数据库中数据的增删改查操作的代码

    简单说操作的步骤: 1.连接数据库 2.将SQL语句发送到数据库 3.执行SQL语句 这里举个例子: 在一个数据库中有个students表,表中有学号(Id),姓名(Name),性别(Sex),地址( ...

  9. zabbix实现对mysql数据库的监控

    安装.配置zabbix,请点击这里 文章目录 实验环境: 数据库安装&配置: 系统自带的基础监控项目: 配置自己的mysql监控模版 实验环境: server1:Zabbix server + ...

最新文章

  1. 如何一眼识别蚂蚁集团身价千万的阿里人
  2. Python ln_Python入门教程(三):史上最全的Numpy计算函数总结,建议收藏!
  3. RHEL7切换Firewall为iptables
  4. Delphi编码规范
  5. [转]javaandroid线程池
  6. Atcoder ARC062F - AtCoDeerくんとグラフ色塗り / Painting Graphs with AtCoDeer
  7. linux下使用c进行线程操作
  8. caffe MNIST官方文档中文版
  9. NeHe OpenGL第三十二课:拾取游戏
  10. 极客技术专题【003期】:java mvc 增删改查 自动生成工具来袭
  11. ValueError: Cannot feed value of shape (784,) for Tensor 'Placeholder:0', which has shape '(?, 784)'
  12. 精通innodb引擎_《MySQL技术内幕:InnoDB存储引擎》PDF 下载
  13. WPS JSA 学习笔记
  14. box-sizing属性介绍
  15. 新手看Mockplus
  16. Matlab---示波器Scope-Measurements
  17. 网站底部添加公安备案HTML代码
  18. 【渝粤题库】广东开放大学 劳动和社会保障法 形成性考核
  19. 读取xslx文件(一)
  20. 扫码支付是如何实现的?

热门文章

  1. 我的省选 Day -14
  2. Python实践教程--列表与元组
  3. MacOS 通过MacPorts 安装snappy
  4. NATAPP内网穿透工具
  5. Lava为什么可以在PoC项目中脱颖而出
  6. kotlin - 扩展方法和扩展属性
  7. 什么是https(加密)协议,彻底搞懂https
  8. DownloadManager的使用
  9. 国二上机c语言题型,国二c语言上机国二真题
  10. 完胜汪涵、李咏、毕福剑 何炅被评综艺一哥/图