数据库版本控制

背景介绍

        数据库版本的变更在我们日常开发中是一个非常常见的场景,下面我们分析下,基于Nodejs会哪些方法呢

Solution 1 use Sequelize

1 Sequelize introduce

https://sequelize.org/docs/v6/other-topics/migrations/

2 Practice in response

2.1 install
npm install sequelize  sequelize-cli
2.2 prepare .sequelizerc config file
// .sequelizercconst path = require('path');module.exports = {config: path.resolve('config', 'database.json'),//2.3 define database config file path'migrations-path': path.resolve('config', 'migrations') //2.4 define migrateions dir
};

2.3 prepare database.json

{"development": {"username": "xxx","password": "xxx","database": "xxx","host": "xxx","dialect": "mysql"}
}

2.4 write migrate code

  • define the file of migrate ,realize the up and down function

  • when you exec the “migrate: run“ cmd ,the up function will be exec

  • when you exec the “migrate: undo“ cmd ,the down function will be exec

  • before “migrate:run” exec ,it will create a table(SequelizeMeta) in the current db

  • the SequelizeMeta will record the current migrate file (version) to guarantee won't repeat execution

  • the dir /migrations all the file will be checked an execution

2.5 automation

RUN npx sequelize db:migrate --env production

add the cmd in the docker file ,when cmd “npm install“ execution end ,it will be executed

ensure you should not login to the pod to run this cmd

Solution 2 Handwrite the above steps

        //  查询config表获取当前版本,并且查看目标版本号//  新增配置,如果目标版本为空,则需要到最新的版本//  获取某文件路径下的 升级脚本和日期进行排序//  判断是版本升级还是版本回滚//  如果是升级://          判断当前file是否在data目录里面,如果是的话,不需要执行,如果不在,则需要执行该文件//          每次执行完,更新数据库信息,将新版本写入db中//  如果是回滚://          判断当前file是否在data目录里面,如果是的话,执行回滚,如果不在,则不需要执行该文件//          每次执行完,更新数据库信息,移除当前版本信息

Step1: 创建migrations文件夹,所有升级的脚本都定义在该文件夹下,升级的脚本可以是js,也可以是sql形式

step2: 创建migrate的流程

const fs = require('fs');
const path = require('path');
const MIGRATIONS_DIR = path.join(__dirname, 'migrations');async function getCurrentVersion(connection) {const [rows] = await connection.execute(`SELECT value FROM config WHERE id = 'db_version'`);return rows.length > 0 ? rows[0].value : null;
}async function setVersion(connection, version) {await connection.execute(`INSERT INTO config (key, value) VALUES ('db_version', ?)  ON DUPLICATE KEY UPDATE value = VALUES(value);`, [version])
}async function getMigrations() {return fs.readdirSync(MIGRATIONS_DIR).filter(file => file.endsWith('.js')).map(file => {const [date, name] = file.split('-');return { date, name, file };}).sort((a, b) => a.date.localeCompare(b.date));
}async function migrate(connection, targetVersion = null) {try {await connection.query('START TRANSACTION');const currentVersion = await getCurrentVersion(connection);const migrations = await getMigrations();const currentIndex = migrations.findIndex(m => m.date === currentVersion);const targetIndex = targetVersion ? migrations.findIndex(m => m.date === targetVersion) : migrations.length - 1;if (targetIndex === -1) {throw new Error(`Target version ${targetVersion} not found`);}if (currentIndex < targetIndex) {console.log('Upgrading...');for (let i = currentIndex + 1; i <= targetIndex; i++) {const migration = migrations[i];const migrationPath = path.join(MIGRATIONS_DIR, migration.file);const { up } = require(migrationPath);console.log(`Executing ${migration.file}`);await up(connection);await setVersion(connection, migration.date);}} else if (currentIndex > targetIndex) {console.log('Rolling back...');for (let i = currentIndex; i > targetIndex; i--) {const migration = migrations[i];const migrationPath = path.join(MIGRATIONS_DIR, migration.file);const { down } = require(migrationPath);console.log(`Reverting ${migration.file}`);await down(connection);await setVersion(connection, i > 0 ? migrations[i - 1].date : null);}} else {console.log('Already at target version');}await connection.commit()} catch (error) {await connection.rollback()console.error('Migration failed:', error);} finally {connection.release();}
}
module.exports = {migrate
}

step3:db初始化时候,判断是否执行

guideline
s1
data migrate
记录 migrate log

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

多肽合成的一般步骤 -- 固相合成篇

1.1 溶剂的处理 DMF、甲醇在使用前用G3孔的分子筛浸泡过夜除杂质和水。 1.2 树脂的充分溶胀 称取2.0 g 空白Wang树脂于洁净干燥的反应管中&#xff0c;加入15 mL DMF&#xff0c;室温活化30 min左右。 1.3 接第一个氨基酸 室温下&#xff0c;通过沙芯抽滤掉上步溶剂&#xf…

中电金信 :基于开放架构的私有云建设实践

01开放架构私有云诞生背景 随着国产化创新建设的深化&#xff0c;产业侧行业软件持续进行云原生改造&#xff0c;金融机构拥抱云和容器技术&#xff0c;实现数智化转型已是大势所趋。近年&#xff0c;云原生技术以及架构发展速度更是惊人&#xff0c;私有云开始有了新架构、有了…

<刷题笔记> 力扣105/106题 使用中序+前(后)序构造二叉树

在曾经的博客中&#xff0c;曾经记录过这样一题&#xff1a; 二叉树遍历_牛客题霸_牛客网 (nowcoder.com) 这是一个只需要前序就能构造二叉树的题&#xff0c;因为一旦遇到空&#xff0c;就有"#"作为返回的标志&#xff0c;能够立刻返回。 1. 中序前序 完全可以借鉴…

select查询表单

select查询语法&#xff1a; select 【1】from 【2】where 【3】 1若为*表示显示全部数据列&#xff0c;若为某一列列名则只显示本列内容&#xff08;也可为多列列名&#xff09;。若在1后面加as ‘c’&#xff0c;则表示把查询的列名换成c。 2为要查询的表表名。 3为查询的…

众数信科 AI智能体智慧文旅解决方案——智能旅行助手

智慧文旅解决方案 智能旅行助手方案 利用先进的AI算法 提供个性化旅游体验的智能服务 众数信科AI智能体 产品亮点 旅游路线智能规划 旅游景点智能问答 旅行游记智能生成等 构建旅行实用指南 让旅游更加便捷、高效、智能化 关于我们 众数信科成立于2021年&#xff0c;由…

CentOS Linux教程(6)--CentOS目录

文章目录 1. 根目录2. cd目录切换命令3. CentOS目录介绍4. pwd命令介绍5. ls命令介绍5.1 ls5.2 ls -a5.3 ls -l 1. 根目录 Windows电脑的根目录是计算机(我的电脑)&#xff0c;然后C盘、D盘。 Linux系统的根目录是/&#xff0c;我们可以使用cd /进入根目录&#xff0c;然后使…

【mysql】case...when...、group...by、sum() 聚合函数... 企业组合使用实际场景示例

文章目录 查询需求场景预设查询结果SQL实现查询 查询需求场景 -- 统计当月不同流程类型的审批通过流程数、审批终止流程数、审批驳回流程数、新增流程数&#xff08;归档终止退回&#xff09;、申请总条目数&#xff08;关联任务单申请条目数总数&#xff09;-- 查询思路&…

蘑菇成熟待收检测系统源码分享

蘑菇成熟待收检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

最适配达梦、人大金仓的sql工具是什么?

SQLynx是一款功能强大的数据库管理工具&#xff0c;它不仅支持Oracle、MySQL等国际主流数据库&#xff0c;还很好地支持了武汉达梦、人大金仓等国产数据库。这款工具具有以下几个特点&#xff1a; 1.广泛支持&#xff1a;SQLynx支持多种数据库系统&#xff0c;包括PostgreSQL、…

ADC 位的作用

示波器的横轴表示时间基准&#xff08;秒/格或 s/p&#xff09;&#xff0c;而纵轴表示电压&#xff08;伏/格或 V/p&#xff09;。垂直精度是指示波器显示信号电压的准确程度&#xff0c;这对于视觉呈现和测量至关重要。示波器屏幕上的电压读数越接近实际信号电压&#xff0c;…

专为工程地质领域安全监测而设计,BWII型广播预警遥测系统助您实现全面监测!

专为工程地质领域安全监测而设计&#xff0c;BWII型广播预警遥测系统助您实现全面监测&#xff01; BWII型广播预警遥测系统是一款新型的雨量预警监测仪&#xff0c;具备多通道和多类型传感器接入功能。该系统能够定时采集和发送电压、电流、数字和脉冲等信息&#xff0c;同时结…

Day4-C语言高级编程

1. gcc和gdb的用法 GNU工具&#xff1a;编译工具&#xff1a;把一个源程序编译为一个可执行程序调试工具&#xff1a;能对执行程序 进行源码或汇编调试软件工程工具&#xff1a;用于协助多人开发或大型软件项目的管理&#xff0c;如make、CVS、Subvision其他工具&#xff1a;用…

Informer模型复现项目实战

加入会员社群&#xff0c;免费获取本项目数据集和代码&#xff1a;点击进入>> 1. 项目简介 A034-Informer模型复现项目实战的目标是通过复现Informer模型&#xff0c;帮助理解其在时间序列预测中的实际应用和效果。该项目基于深度学习模型Informer&#xff0c;这是一种针…

科研绘图系列:R语言连线点图(linechart dotplot)

文章目录 介绍加载R包导入数据数据预处理画图组合图形导出数据系统信息介绍 不同物种的强度和微生物的组成情况 加载R包 library("here") library("tidyverse") library("reshape2") library("vegan")

如何获取一个返回Promise<T>的函数的“T“的类型

type ThenArg<T> T extends Promise<infer U> ? U : never export type GenByStaTypeAndHfRsType ThenArg<ReturnType<typeof genByStaTypeAndHf>> 这样一来&#xff0c;虽然返回了Promise<T>&#xff0c;我们没定义T的情况下&#xff0c;也可…

揭秘大模型背后的神秘力量:算力、数据与算法的“黄金三角”

目录 揭秘大模型背后的神秘力量:算力、数据与算法的“黄金三角” 一、算力:大模型的超级引擎 二、数据:大模型的智慧源泉 三、高性能算法:大模型的智慧大脑 结语:黄金三角的共鸣 揭秘大模型背后的神秘力量:算力、数据与算法的“黄金三角” 在人工智能的浩瀚星空中,…

基于Ambari搭建hadoop生态圈+Centos7安装教程V2.0优化版(本篇博客写的较为详细,可能比较多,请耐心看)

当我们学习搭建hadoop的时候&#xff0c;未免也会遇见很多繁琐的事情&#xff0c;比如很多错误&#xff0c;需要解决。在以后公司&#xff0c;也不可能让你一个一个搭建hadoop&#xff0c;成千上万的电脑&#xff0c;你再一个个搭建&#xff0c;一个个报错&#xff0c;而且每台…

计算机毕业设计 基于Flask+Vue的博客系统 Python毕业设计 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

苹果和香蕉联合食用,益处最大,能控制血压水平,高血压死亡风险降低 40%!

文章目录 引言苹果和香蕉有助于调节血压知识扩展引言 2024年,大连医科大学第二附属医院等多家机构的研究人员刊发在《营养学前沿》杂志的一项研究发现:高血压患者中常吃(每周吃 3~6 次)香蕉或苹果的人,全因死亡率降低 24%~40%;而当患者对两种水果摄入频率都较高(每周吃…

Ubuntu18升级cmake和python

Ubuntu18升级cmake和python 1、升级cmake至3.22.12、升级python至3.82.1 安装依赖包2.2 添加deadsnakes PPA源2.3 安装python3.82.4 将python各版本添加到update-alternatives2.5 配置python3默认指向python3.82.6 测试python3版本2.7 配置python默认指向python32.8 测试python…