Untitled
unknown
plain_text
2 years ago
4.4 kB
8
Indexable
const express = require('express');
const app = express();
const mysql = require('mysql');
const { Pool } = require('pg');
const _ = require('lodash');
// Konfiguracja połączenia z bazą MySQL (baza A)
const mysqlConnection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'twoje_haslo',
database: 'baza_a'
});
// Konfiguracja połączenia z bazą PostgreSQL (baza B)
const pgPool = new Pool({
user: 'twoj_uzytkownik',
password: 'twoje_haslo',
host: 'localhost',
database: 'baza_b'
});
// Funkcja do obsługi błędów
function handleError(err, res) {
console.error(err);
res.status(500).json({ message: 'Wystąpił błąd', error: err.message });
}
// Funkcja do pobierania JSONów z bazy MySQL
function getJSONsFromMySql() {
return new Promise((resolve, reject) => {
mysqlConnection.query('SELECT json_data FROM twoja_tabela', (err, results) => {
if (err) {
reject(err);
} else {
resolve(results.map(result => JSON.parse(result.json_data)));
}
});
});
}
// Funkcja do pobierania JSONów z bazy PostgreSQL
async function getJSONsFromPostgres() {
try {
const { rows } = await pgPool.query('SELECT json_data FROM twoja_tabela');
return rows.map(row => row.json_data);
} catch (err) {
throw err;
}
}
// Funkcja do łączenia JSONów po kluczu
function mergeJSONsByKey(mysqlJSONs, postgresJSONs, key) {
const merged = {};
mysqlJSONs.forEach(json => {
merged[json[key]] = { mysql: json };
});
postgresJSONs.forEach(json => {
if (merged[json[key]]) {
merged[json[key]].postgres = json;
} else {
merged[json[key]] = { postgres: json };
}
});
return merged;
}
// Funkcja do porównywania JSONów
function compareJSONs(merged) {
const differences = {};
Object.entries(merged).forEach(([key, value]) => {
const { mysql, postgres } = value;
if (!_.isEqual(mysql, postgres)) {
differences[key] = { mysql, postgres };
}
});
return differences;
}
// Funkcja do zapisu różnic w bazie PostgreSQL
async function saveDifferencesToPostgres(differences) {
const client = await pgPool.connect();
try {
await client.query('BEGIN');
const query = 'INSERT INTO twoja_tabela_roznic (klucz, json_mysql, json_postgres) VALUES ($1, $2, $3)';
const promises = Object.entries(differences).map(([key, value]) =>
client.query(query, [key, JSON.stringify(value.mysql), JSON.stringify(value.postgres)])
);
await Promise.all(promises);
await client.query('COMMIT');
} catch (err) {
await client.query('ROLLBACK');
throw err;
} finally {
client.release();
}
}
// Endpoint API do uruchamiania procesu porównywania
// app.get('/compare', async (req, res) => {
// try {
// const mysqlJSONs = await getJSONsFromMySql();
// const postgresJSONs = await getJSONsFromPostgres();
// const merged = mergeJSONsByKey(mysqlJSONs, postgresJSONs, 'klucz');
// const differences = compareJSONs(merged);
// await saveDifferencesToPostgres(differences);
// res.json({ message: 'Porównywanie zakończone', differences });
// } catch (err) {
// handleError(err, res);
// }
// });
// test bez dostępu do bazy B
app.get('/compare', async (req, res) => {
try {
const mysqlJSONs = await getJSONsFromMySql();
const postgresJSONs = await getJSONsFromPostgres();
const merged = mergeJSONsByKey(mysqlJSONs, postgresJSONs, 'klucz');
const differences = compareJSONs(merged);
// Wyświetl różnice w konsoli
console.log('Znalezione różnice:');
console.log(differences);
// Alternatywnie, zapisz różnice do pliku
const fs = require('fs');
fs.writeFileSync('differences.json', JSON.stringify(differences, null, 2));
res.json({ message: 'Porównywanie zakończone' });
} catch (err) {
handleError(err, res);
}
});
app.listen(3000, () => {
console.log('Serwer działa na porcie 3000');
});
// Obsługa błędów połączenia z bazą MySQL
mysqlConnection.connect(err => {
if (err) {
console.error('Błąd połączenia z bazą MySQL:', err);
process.exit(1); // Zakończ proces, jeśli wystąpi błąd połączenia
}
});
// Obsługa błędów z pool połączeń PostgreSQL
pgPool.on('error', (err, client) => {
console.error('Błąd z pool połączeń PostgreSQL:', err);
if (client) {
client.release(); // Zwolnij klienta z pool
}
});Editor is loading...
Leave a Comment