Initial commit
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
/**
|
||||
* Diagnostic rapide de la base de données crowdlending
|
||||
* Exécuter depuis D:\dev\crowdlending-app\backend :
|
||||
* node diag.mjs
|
||||
*/
|
||||
import Database from 'better-sqlite3';
|
||||
import path from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
const DB_PATH = path.resolve(__dirname, 'data/crowdlending.db');
|
||||
|
||||
const db = new Database(DB_PATH, { readonly: true });
|
||||
|
||||
console.log('\n=== COMPTES PAR TABLE ===');
|
||||
for (const t of ['users','investisseurs','investissements','plateformes','remboursements','simul_remboursements','depots_retraits','investissement_historique']) {
|
||||
try {
|
||||
const n = db.prepare(`SELECT COUNT(*) AS n FROM "${t}"`).get().n;
|
||||
console.log(` ${t.padEnd(30)} ${n} lignes`);
|
||||
} catch (e) {
|
||||
console.log(` ${t.padEnd(30)} ERREUR: ${e.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
console.log('\n=== TABLES __repair_* RESTANTES ===');
|
||||
const repairTables = db.prepare("SELECT name FROM sqlite_master WHERE name LIKE '__repair_%'").all();
|
||||
if (repairTables.length === 0) console.log(' (aucune)');
|
||||
else repairTables.forEach(r => console.log(` ${r.name}`));
|
||||
|
||||
console.log('\n=== USERS ===');
|
||||
db.prepare('SELECT id, email FROM users').all().forEach(r =>
|
||||
console.log(` user id=${r.id} email=${r.email}`)
|
||||
);
|
||||
|
||||
console.log('\n=== INVESTISSEURS ===');
|
||||
db.prepare('SELECT id, nom, user_id FROM investisseurs').all().forEach(r =>
|
||||
console.log(` investisseur id=${r.id} nom="${r.nom}" user_id=${r.user_id}`)
|
||||
);
|
||||
|
||||
console.log('\n=== INVESTISSEMENTS (5 premiers) ===');
|
||||
const invs = db.prepare('SELECT id, nom_projet, investisseur_id, statut FROM investissements LIMIT 5').all();
|
||||
if (invs.length === 0) console.log(' (TABLE VIDE!)');
|
||||
else invs.forEach(r =>
|
||||
console.log(` inv id=${r.id} investisseur_id=${r.investisseur_id} statut=${r.statut} projet="${r.nom_projet}"`)
|
||||
);
|
||||
|
||||
console.log('\n=== VÉRIFICATION FK investissements → investisseurs ===');
|
||||
const broken = db.prepare(`
|
||||
SELECT COUNT(*) AS n FROM investissements i
|
||||
WHERE NOT EXISTS (SELECT 1 FROM investisseurs v WHERE v.id = i.investisseur_id)
|
||||
`).get().n;
|
||||
console.log(broken === 0 ? ' OK (pas de FK cassée)' : ` ⚠️ ${broken} investissements avec investisseur_id introuvable!`);
|
||||
|
||||
console.log('\n=== VÉRIFICATION FK remboursements → investissements ===');
|
||||
const broken2 = db.prepare(`
|
||||
SELECT COUNT(*) AS n FROM remboursements r
|
||||
WHERE NOT EXISTS (SELECT 1 FROM investissements i WHERE i.id = r.investissement_id)
|
||||
`).get().n;
|
||||
console.log(broken2 === 0 ? ' OK' : ` ⚠️ ${broken2} remboursements avec investissement_id introuvable!`);
|
||||
|
||||
console.log('\n=== CHECK CONSTRAINT de investissements ===');
|
||||
const schemaInv = db.prepare("SELECT sql FROM sqlite_master WHERE type='table' AND name='investissements'").get()?.sql ?? '';
|
||||
const checkLine = schemaInv.split('\n').find(l => l.includes('statut') && l.includes('CHECK'));
|
||||
console.log(' ', checkLine?.trim() ?? '(non trouvé)');
|
||||
|
||||
console.log('\n=== RÉFÉRENCES _investissements_old RESTANTES ===');
|
||||
const refs = db.prepare("SELECT type, name FROM sqlite_master WHERE sql LIKE '%_investissements_old%'").all();
|
||||
if (refs.length === 0) console.log(' (aucune) ✓');
|
||||
else refs.forEach(r => console.log(` [${r.type}] ${r.name}`));
|
||||
|
||||
db.close();
|
||||
console.log('\nDiagnostic terminé.\n');
|
||||
Reference in New Issue
Block a user