Filtros de version al reves
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "migration_tool",
|
"name": "migration-tool",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Herramienta de migracion de bdd",
|
"description": "Herramienta de migracion de bdd",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
|
|||||||
50
src/index.ts
50
src/index.ts
@@ -1,19 +1,14 @@
|
|||||||
#!/usr/bin/node
|
#!/usr/bin/node
|
||||||
|
|
||||||
|
import { constants } from 'buffer';
|
||||||
import { existsSync } from 'fs';
|
import { existsSync } from 'fs';
|
||||||
import fs from 'fs/promises';
|
import fs from 'fs/promises';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import { Pool } from 'pg';
|
import { Pool } from 'pg';
|
||||||
import { env } from 'process';
|
import { env, version } from 'process';
|
||||||
import yargs from 'yargs';
|
import yargs from 'yargs';
|
||||||
import { hideBin } from 'yargs/helpers';
|
import { hideBin } from 'yargs/helpers';
|
||||||
|
|
||||||
const db = new Pool({
|
|
||||||
host: env.POSTGRES_HOST,
|
|
||||||
user: env.POSTGRES_USER,
|
|
||||||
port: Number(env.POSTGRES_PORT),
|
|
||||||
password: env.POSTGRES_PASSWORD
|
|
||||||
})
|
|
||||||
|
|
||||||
type MigrationFile = {
|
type MigrationFile = {
|
||||||
version: string;
|
version: string;
|
||||||
@@ -111,10 +106,10 @@ function compareVersions(va: string, vb: string) {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getCurrentVersion() {
|
async function getCurrentVersion(db: Pool) {
|
||||||
try {
|
try {
|
||||||
const lastVersion = await db.query<DBVersion>(`
|
const lastVersion = await db.query<DBVersion>(`
|
||||||
SELECT * form db_versions
|
SELECT * FROM db_versions
|
||||||
ORDER BY creation_date DESC
|
ORDER BY creation_date DESC
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
`)
|
`)
|
||||||
@@ -135,13 +130,33 @@ async function runMigrations(args: {
|
|||||||
currentVersion?: string,
|
currentVersion?: string,
|
||||||
migrationDir: string
|
migrationDir: string
|
||||||
}) {
|
}) {
|
||||||
|
let db;
|
||||||
|
try {
|
||||||
|
db = new Pool({
|
||||||
|
host: env.POSTGRES_HOST,
|
||||||
|
user: env.POSTGRES_USER,
|
||||||
|
port: Number(env.POSTGRES_PORT),
|
||||||
|
password: env.POSTGRES_PASSWORD,
|
||||||
|
database: env.POSTGRES_DATABASE
|
||||||
|
})
|
||||||
|
} catch (e) {
|
||||||
|
console.error("[x] Error conectando a la base datos. Host: ", env.POSTGRES_HOST, " DB: ", env.POSTGRES_DATABASE)
|
||||||
|
console.error(e)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const dbClient = await db.connect()
|
const dbClient = await db.connect()
|
||||||
try {
|
try {
|
||||||
// 1º La version explicita 2º La versión almacenada en BDD 3º 0.0.0 como version base
|
// 1º La version explicita 2º La versión almacenada en BDD 3º 0.0.0 como version base
|
||||||
const currentVersion = args.currentVersion ?? (await getCurrentVersion())?.version ?? "0.0.0"
|
const versionBdd = (await getCurrentVersion(db))?.version
|
||||||
console.log("[i] Migrando desde la version " + currentVersion)
|
if (versionBdd == undefined) {
|
||||||
|
console.log("[x] Error buscando la ultima version de la base de datos")
|
||||||
|
}
|
||||||
|
const currentVersion = args.currentVersion ?? versionBdd ?? "0.0.0"
|
||||||
|
console.log("[i] Migrando desde la version " + currentVersion + " a la version " + args.targetVersion)
|
||||||
const files = await fs.readdir(args.migrationDir);
|
const files = await fs.readdir(args.migrationDir);
|
||||||
|
console.log("Directorio de migraciones", args.migrationDir)
|
||||||
|
console.log("Archivos de migraciones", files)
|
||||||
const pendingMigrations: MigrationFile[] = files
|
const pendingMigrations: MigrationFile[] = files
|
||||||
.map(f => (<MigrationFile>{
|
.map(f => (<MigrationFile>{
|
||||||
version: path.parse(f).name,
|
version: path.parse(f).name,
|
||||||
@@ -149,9 +164,9 @@ async function runMigrations(args: {
|
|||||||
fullPath: path.join(args.migrationDir, f)
|
fullPath: path.join(args.migrationDir, f)
|
||||||
}))
|
}))
|
||||||
// 1. Filtrar las migraciones > que la actual
|
// 1. Filtrar las migraciones > que la actual
|
||||||
.filter(v => compareVersions(v.version, currentVersion) == -1)
|
.filter(v => compareVersions(v.version, currentVersion) >= 0)
|
||||||
// 2. Filtra las migraciones <= que la objetivo
|
// 2. Filtra las migraciones <= que la objetivo
|
||||||
.filter(v => compareVersions(v.version, args.targetVersion) >= 0)
|
.filter(v => compareVersions(v.version, args.targetVersion) == -1)
|
||||||
.sort((a, b) => compareVersions(a.version, b.version));
|
.sort((a, b) => compareVersions(a.version, b.version));
|
||||||
|
|
||||||
if (pendingMigrations.length === 0) {
|
if (pendingMigrations.length === 0) {
|
||||||
@@ -187,13 +202,10 @@ async function runMigrations(args: {
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
// await db.query('COMMIT');
|
|
||||||
await db.query("COMMIT")
|
await db.query("COMMIT")
|
||||||
console.log("✨ Migraciones completadas con éxito.");
|
console.log("[o] Migraciones completadas con éxito.");
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// Si algo falla, el rollback es vital en DevOps
|
console.error("[x] Error durante la migración. Se ha realizado un rollback automático.");
|
||||||
// await db.query('ROLLBACK');
|
|
||||||
console.error("❌ Error durante la migración. Se ha realizado un rollback automático.");
|
|
||||||
console.error(error);
|
console.error(error);
|
||||||
await db.query("ROLLBACK")
|
await db.query("ROLLBACK")
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
|
|||||||
Reference in New Issue
Block a user