13 lines
1.7 KiB
JavaScript
13 lines
1.7 KiB
JavaScript
import fs from 'node:fs';
|
|||
|
|
const dir=new URL('./',import.meta.url);
|
||
|
|
function parse(file){let db='';const result=new Map();for(const m of fs.readFileSync(new URL(file,dir),'utf8').matchAll(/USE `(\w+)`;|CREATE TABLE `(\w+)` \(([\s\S]*?)\n\) ENGINE=[^;]+;/g)){if(m[1])db=m[1];else result.set(db+'.'+m[2],{db,name:m[2],sql:m[0],defs:m[3].split(/\r?\n/).map(s=>s.trim().replace(/,$/,''))});}return result;}
|
||
|
|
const before=parse('schema-before.sql'),after=parse('schema-after.sql'),report={},ddl=['-- 本次本机结构修复的实际增量,仅用于审阅与原始快照对照。已执行,禁止在当前库重复执行。','SET NAMES utf8mb4;'];
|
||
|
|
for(const [key,t] of after){const r=report[t.db]??={createdTables:[],addedColumns:[],addedIndexes:[]};const old=before.get(key);ddl.push('USE `'+t.db+'`;');
|
||
|
|
if(!old){r.createdTables.push(t.name);ddl.push(t.sql);continue;}
|
||
|
|
const oldCols=new Set(old.defs.map(d=>d.match(/^`(\w+)`/)?.[1]).filter(Boolean));
|
||
|
|
const oldKeys=new Set(old.defs.map(d=>d.match(/^(?:UNIQUE )?KEY `(\w+)`/)?.[1]).filter(Boolean));
|
||
|
|
for(const d of t.defs){const c=d.match(/^`(\w+)`/),i=d.match(/^(?:UNIQUE )?KEY `(\w+)`/);if(c&&!oldCols.has(c[1])){r.addedColumns.push(t.name+'.'+c[1]);ddl.push('ALTER TABLE `'+t.name+'` ADD COLUMN '+d+';');}else if(i&&!oldKeys.has(i[1])){r.addedIndexes.push(t.name+'.'+i[1]);ddl.push('ALTER TABLE `'+t.name+'` ADD '+d+';');}}
|
||
|
|
}
|
||
|
|
fs.writeFileSync(new URL('actual-changes.json',dir),JSON.stringify(report,null,2));fs.writeFileSync(new URL('actual-incremental-review.sql',dir),ddl.join('\n\n'));
|
||
|
|
for(const [db,r] of Object.entries(report))console.log(db,{tables:r.createdTables.length,columns:r.addedColumns.length,indexes:r.addedIndexes.length});
|