Untitled
unknown
plain_text
a year ago
4.4 kB
4
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