migrate-mongo实现对mongo数据库执行脚本版本控制
描述:
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
上面的初始化命令做了两件事:
创建了一个migrate-mongo-config.js文件 (该文件用于连接MongoDB数据库相关配置)
创建了一个migrations文件夹 (该文件夹用于存储执行脚本文件)
链接配置及配置信息加密
migrate-mongo-config.js文件配置详情
migrate-mongo-config.js文件为配置远程mongodb数据库的连接配置文件。编辑migrate-mongo-config.js文件,确保url及databaseName正确配置。
// 在这个文件中,您可以配置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数据库执行脚本版本控制相关推荐
- Go web 开发数据库管理平台,利用远程过程调用(RPC)实现对MySQL数据库的管理和使用
Go web 开发数据库管理平台,利用远程过程调用(RPC)实现对MySQL数据库的管理和使用 前言 做DBA,最基本的工作就是需要管理公司的数据库系统.工作中,常常需要维护的数据库数量是非常多的.小 ...
- Qt实战案例(28)——利用QSQL相关类实现对MySQL数据库的基本操作及相关设置详解
目录 一.项目介绍 二.项目基本配置 2.1 安装MySQL 2.2 创建Qt项目 2.3 移动libmysql.dll文件 三.UI界面设计 四.主程序实现 4.1 pro文件 4.2 main.c ...
- oracle执行命令显示2,oracle数据库执行脚本时常用命令总结
收集了一篇oracle数据库执行脚本常用命令总结,希望给同学带来一些帮助. 1. 执行一个SQL脚本文件 代码如下 sqlplus user/pass@servicenamefile_name.sql ...
- 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 ...
- oracle执行命令显示2,Oracle数据库执行脚本常用命令小结
1. 执行一个SQL脚本文件 复制代码 代码如下: sqlplus user/pass@servicename 或 复制代码 代码如下: SQL>start file_names 或 复制代码 ...
- zabbix实现对mysql数据库主从监控
1.主从关系建立 配置mysql-master端: 1)修改mysql-master的配置文件 [root@localhost ~]# vim /etc/my.cnf [mysqld] server_ ...
- oracle cronb,利用Crontab实现对Oracle数据库的定时备份
假设数据库的拥有者为oracle,数据库的用户为scott,其口令为trigger, Oracle数据库的参数$ORACLE_HOME为/usr/oracle,$ORACLE_SID为oracle1, ...
- 实现对mysql增删改查_Java语言实现对MySql数据库中数据的增删改查操作的代码
简单说操作的步骤: 1.连接数据库 2.将SQL语句发送到数据库 3.执行SQL语句 这里举个例子: 在一个数据库中有个students表,表中有学号(Id),姓名(Name),性别(Sex),地址( ...
- zabbix实现对mysql数据库的监控
安装.配置zabbix,请点击这里 文章目录 实验环境: 数据库安装&配置: 系统自带的基础监控项目: 配置自己的mysql监控模版 实验环境: server1:Zabbix server + ...
最新文章
- 如何一眼识别蚂蚁集团身价千万的阿里人
- Python ln_Python入门教程(三):史上最全的Numpy计算函数总结,建议收藏!
- RHEL7切换Firewall为iptables
- Delphi编码规范
- [转]javaandroid线程池
- Atcoder ARC062F - AtCoDeerくんとグラフ色塗り / Painting Graphs with AtCoDeer
- linux下使用c进行线程操作
- caffe MNIST官方文档中文版
- NeHe OpenGL第三十二课:拾取游戏
- 极客技术专题【003期】:java mvc 增删改查 自动生成工具来袭
- ValueError: Cannot feed value of shape (784,) for Tensor 'Placeholder:0', which has shape '(?, 784)'
- 精通innodb引擎_《MySQL技术内幕:InnoDB存储引擎》PDF 下载
- WPS JSA 学习笔记
- box-sizing属性介绍
- 新手看Mockplus
- Matlab---示波器Scope-Measurements
- 网站底部添加公安备案HTML代码
- 【渝粤题库】广东开放大学 劳动和社会保障法 形成性考核
- 读取xslx文件(一)
- 扫码支付是如何实现的?