- Agregar creación de tablas antes de insertar datos - Corregir sintaxis de comillas en SQL para tabla kv - Eliminar tablas existentes antes de recrear para evitar errores - Migración ejecutada exitosamente: 2 usuarios, 3 pacientes, 5 areas, 69 camas, 6 internaciones, etc.
289 lines
8.4 KiB
JavaScript
289 lines
8.4 KiB
JavaScript
import Database from 'better-sqlite3';
|
|
import { fileURLToPath } from 'url';
|
|
import { dirname, join } from 'path';
|
|
import * as mariadb from 'mariadb';
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
const SQLITE_PATH = join(__dirname, 'data', 'hospital.db');
|
|
|
|
// MariaDB connection config
|
|
const mariaPool = mariadb.createPool({
|
|
host: process.env.DB_HOST || '10.9.8.135',
|
|
port: parseInt(process.env.DB_PORT || '3306'),
|
|
user: process.env.DB_USER || 'snlavaise',
|
|
password: process.env.DB_PASSWORD || '1123581321Rtaylor%_+',
|
|
database: process.env.DB_NAME || 'santojanni',
|
|
connectionLimit: 5,
|
|
});
|
|
|
|
// Table definitions for MariaDB
|
|
const CREATE_TABLES = [
|
|
`CREATE TABLE IF NOT EXISTS usuarios (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
apellido VARCHAR(255) NOT NULL,
|
|
nombre VARCHAR(255) NOT NULL,
|
|
dni VARCHAR(20) NOT NULL UNIQUE,
|
|
fechaNacimiento VARCHAR(10),
|
|
email VARCHAR(255),
|
|
rol VARCHAR(50),
|
|
matriculaProfesional VARCHAR(100),
|
|
passwordHash VARCHAR(255),
|
|
areaId VARCHAR(36),
|
|
fechaCreacion VARCHAR(10)
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS pacientes (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
apellido VARCHAR(255) NOT NULL,
|
|
nombre VARCHAR(255) NOT NULL,
|
|
dni VARCHAR(20) NOT NULL UNIQUE,
|
|
fechaNacimiento VARCHAR(10),
|
|
sexo VARCHAR(10),
|
|
telefono VARCHAR(50),
|
|
email VARCHAR(255),
|
|
direccion TEXT,
|
|
obraSocial VARCHAR(100),
|
|
nacionalidad VARCHAR(100),
|
|
medicacionHabitual TEXT,
|
|
antecedentes TEXT,
|
|
alergias TEXT,
|
|
grupoSanguineo VARCHAR(10),
|
|
historiaClinica TEXT
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS areas (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
nombre VARCHAR(255) NOT NULL UNIQUE
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS camas (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
numero VARCHAR(20) NOT NULL,
|
|
areaId VARCHAR(36),
|
|
tipo VARCHAR(50) DEFAULT 'Estándar',
|
|
estado VARCHAR(20) DEFAULT 'Disponible',
|
|
pacienteId VARCHAR(36),
|
|
internacionId VARCHAR(36)
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS internaciones (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
pacienteId VARCHAR(36) NOT NULL,
|
|
camaId VARCHAR(36),
|
|
areaId VARCHAR(36),
|
|
fechaIngresoHospital VARCHAR(10),
|
|
fechaIngresoClinica VARCHAR(10),
|
|
fechaEgreso VARCHAR(10),
|
|
diagnosticoIngreso TEXT,
|
|
motivoConsulta TEXT,
|
|
enfermedadActual TEXT,
|
|
antecedentesEnfermedadActual TEXT,
|
|
diagnosticoEgreso TEXT,
|
|
medicoIngresante VARCHAR(255),
|
|
motivoEgreso VARCHAR(50),
|
|
activa TINYINT DEFAULT 1,
|
|
apache TEXT,
|
|
derivacion TEXT
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS evoluciones (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
internacionId VARCHAR(36) NOT NULL,
|
|
fecha VARCHAR(10) NOT NULL,
|
|
hora VARCHAR(5),
|
|
medico VARCHAR(255),
|
|
signosVitales TEXT,
|
|
examenFisico TEXT,
|
|
novedades TEXT,
|
|
comentarios TEXT,
|
|
pendientes TEXT
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS laboratorios (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
pacienteId VARCHAR(36) NOT NULL,
|
|
internacionId VARCHAR(36),
|
|
fecha VARCHAR(10) NOT NULL,
|
|
hora VARCHAR(5),
|
|
tipo VARCHAR(50),
|
|
resultados TEXT,
|
|
observaciones TEXT,
|
|
medicoSolicitante VARCHAR(255)
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS acidosbase (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
pacienteId VARCHAR(36) NOT NULL,
|
|
internacionId VARCHAR(36),
|
|
fecha VARCHAR(10) NOT NULL,
|
|
hora VARCHAR(5),
|
|
ph DECIMAL(4,2),
|
|
pco2 DECIMAL(6,2),
|
|
po2 DECIMAL(6,2),
|
|
hco3 DECIMAL(6,2),
|
|
be DECIMAL(6,2),
|
|
sato2 DECIMAL(6,2),
|
|
lactato DECIMAL(6,2),
|
|
interpretacion TEXT,
|
|
fio2 DECIMAL(6,2)
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS cultivos (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
pacienteId VARCHAR(36) NOT NULL,
|
|
internacionId VARCHAR(36),
|
|
fechaToma VARCHAR(10),
|
|
protocolo VARCHAR(50),
|
|
fechaResultado VARCHAR(10),
|
|
tipoMuestra VARCHAR(100),
|
|
germen TEXT,
|
|
sensible TEXT,
|
|
resistente TEXT,
|
|
estado VARCHAR(50) DEFAULT 'NAF/Pendiente',
|
|
observaciones TEXT
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS estudiosComplementarios (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
pacienteId VARCHAR(36) NOT NULL,
|
|
internacionId VARCHAR(36),
|
|
fecha VARCHAR(10),
|
|
tipo VARCHAR(100),
|
|
resultado TEXT
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS interconsultas (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
pacienteId VARCHAR(36) NOT NULL,
|
|
internacionId VARCHAR(36) NOT NULL,
|
|
fecha VARCHAR(10),
|
|
servicioInterconsultado VARCHAR(255),
|
|
motivo TEXT,
|
|
respuestaInterconsulta TEXT,
|
|
respuestaFecha VARCHAR(10)
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS atb (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
pacienteId VARCHAR(36) NOT NULL,
|
|
internacionId VARCHAR(36) NOT NULL,
|
|
antibiotico VARCHAR(255),
|
|
fechaInicio VARCHAR(10),
|
|
fechaFinalizacion VARCHAR(10)
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS indicaciones (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
internacionId VARCHAR(36) NOT NULL,
|
|
tipo VARCHAR(50) NOT NULL,
|
|
droga VARCHAR(255),
|
|
dosis VARCHAR(100),
|
|
frecuenciaHoras INT,
|
|
via VARCHAR(50),
|
|
descripcion TEXT,
|
|
tipoPlan VARCHAR(50),
|
|
tipoPlan2 VARCHAR(50),
|
|
cantidadMl INT,
|
|
cantidadMl2 INT,
|
|
tiempoHoras INT,
|
|
estado VARCHAR(20) DEFAULT 'Activa',
|
|
medicoCrea VARCHAR(255),
|
|
fechaCrea VARCHAR(10),
|
|
tipoInsulina VARCHAR(50),
|
|
unidadesDesayuno INT,
|
|
unidadesAlmuerzo INT,
|
|
unidadesNoche INT,
|
|
indicacionNoFco TEXT
|
|
)`,
|
|
`CREATE TABLE IF NOT EXISTS movimientos_indicaciones (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
indicacionId VARCHAR(36) NOT NULL,
|
|
internacionId VARCHAR(36) NOT NULL,
|
|
tipo VARCHAR(50) NOT NULL,
|
|
fecha VARCHAR(10) NOT NULL,
|
|
profesional VARCHAR(255) NOT NULL,
|
|
indicacionPrevia TEXT,
|
|
indicacionNueva TEXT
|
|
)`,
|
|
'CREATE TABLE IF NOT EXISTS kv (\n `key` VARCHAR(255) PRIMARY KEY,\n value TEXT\n )'
|
|
];
|
|
|
|
async function migrate() {
|
|
console.log('Starting migration from SQLite to MariaDB...');
|
|
|
|
// Open SQLite database
|
|
const sqliteDb = new Database(SQLITE_PATH);
|
|
console.log('Connected to SQLite database');
|
|
|
|
const mariaConn = await mariaPool.getConnection();
|
|
console.log('Connected to MariaDB');
|
|
|
|
try {
|
|
// Drop tables in MariaDB first (reverse order due to foreign keys)
|
|
const tablesToDrop = [
|
|
'kv', 'movimientos_indicaciones', 'indicaciones', 'atb', 'interconsultas',
|
|
'estudiosComplementarios', 'cultivos', 'acidosbase', 'laboratorios',
|
|
'evoluciones', 'internaciones', 'camas', 'areas', 'pacientes', 'usuarios'
|
|
];
|
|
console.log('Dropping existing tables...');
|
|
for (const table of tablesToDrop) {
|
|
try {
|
|
await mariaConn.query(`DROP TABLE IF EXISTS ${table}`);
|
|
} catch (e) {
|
|
// Ignore errors
|
|
}
|
|
}
|
|
|
|
// Create tables in MariaDB
|
|
console.log('Creating tables in MariaDB...');
|
|
for (const sql of CREATE_TABLES) {
|
|
await mariaConn.query(sql);
|
|
}
|
|
console.log('Tables created successfully');
|
|
|
|
// Migrate each table
|
|
const tables = [
|
|
'usuarios', 'pacientes', 'areas', 'camas', 'internaciones',
|
|
'evoluciones', 'laboratorios', 'acidosbase', 'cultivos',
|
|
'estudiosComplementarios', 'interconsultas', 'atb',
|
|
'indicaciones', 'movimientos_indicaciones', 'kv'
|
|
];
|
|
|
|
for (const table of tables) {
|
|
console.log(`Migrating ${table}...`);
|
|
|
|
// Get all data from SQLite
|
|
const rows = sqliteDb.prepare(`SELECT * FROM ${table}`).all();
|
|
console.log(` Found ${rows.length} rows in ${table}`);
|
|
|
|
if (rows.length === 0) continue;
|
|
|
|
// Get column names from first row
|
|
const columns = Object.keys(rows[0]);
|
|
const placeholders = columns.map(() => '?').join(', ');
|
|
const columnNames = columns.map(c => `\`${c}\``).join(', ');
|
|
|
|
// Insert into MariaDB
|
|
for (const row of rows) {
|
|
const values = columns.map(col => {
|
|
const val = row[col];
|
|
// Handle JSON strings or special cases
|
|
if (typeof val === 'object' && val !== null) {
|
|
return JSON.stringify(val);
|
|
}
|
|
return val;
|
|
});
|
|
|
|
try {
|
|
await mariaConn.query(
|
|
`INSERT IGNORE INTO ${table} (${columnNames}) VALUES (${placeholders})`,
|
|
values
|
|
);
|
|
} catch (err) {
|
|
console.error(` Error inserting row in ${table}:`, err.message);
|
|
}
|
|
}
|
|
|
|
console.log(` Migrated ${rows.length} rows to ${table}`);
|
|
}
|
|
|
|
console.log('Migration completed successfully!');
|
|
} catch (err) {
|
|
console.error('Migration failed:', err);
|
|
} finally {
|
|
sqliteDb.close();
|
|
mariaConn.release();
|
|
mariaPool.end();
|
|
}
|
|
}
|
|
|
|
migrate();
|