u
This commit is contained in:
54
scripts/downgrade.js
Normal file
54
scripts/downgrade.js
Normal file
@@ -0,0 +1,54 @@
|
||||
/**
|
||||
* Downgrades the database schema to a target version.
|
||||
*
|
||||
* npm run downgrade -- <targetVersion>
|
||||
*
|
||||
* Provider from env: DB_PROVIDER=sqlite (+ SQLITE_PATH) or mssql (MSSQL_*, default).
|
||||
* Runs src/providers/<provider>/downgrade/<from>_to_<to>.js one step at a time,
|
||||
* each in its own transaction. Not part of the server — the server only upgrades.
|
||||
* Note: starting a server whose code knows a higher version upgrades again.
|
||||
*/
|
||||
import 'dotenv/config';
|
||||
|
||||
const [rawTarget] = process.argv.slice(2);
|
||||
const target = Number(rawTarget);
|
||||
if (!rawTarget || !Number.isInteger(target) || target < 1) {
|
||||
console.error('Usage: npm run downgrade -- <targetVersion>');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const providerName = process.env.DB_PROVIDER || (process.env.SQLITE_PATH ? 'sqlite' : 'mssql');
|
||||
let provider;
|
||||
|
||||
if (providerName === 'sqlite' || providerName === 'better-sqlite3') {
|
||||
if (!process.env.SQLITE_PATH) {
|
||||
console.error('SQLITE_PATH is required for DB_PROVIDER=sqlite');
|
||||
process.exit(1);
|
||||
}
|
||||
const { BetterSqlite3Provider } = await import('../src/providers/sqlite3/index.js');
|
||||
provider = new BetterSqlite3Provider({ filename: process.env.SQLITE_PATH, fileMustExist: true });
|
||||
} else if (providerName === 'mssql') {
|
||||
const { MssqlProvider } = await import('../src/providers/mssql/index.js');
|
||||
provider = new MssqlProvider({
|
||||
server: process.env.MSSQL_SERVER,
|
||||
database: process.env.MSSQL_DATABASE,
|
||||
user: process.env.MSSQL_USER,
|
||||
password: process.env.MSSQL_PASSWORD,
|
||||
options: { encrypt: false, trustServerCertificate: true },
|
||||
});
|
||||
} else {
|
||||
console.error(`Unknown DB_PROVIDER: ${providerName}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
try {
|
||||
const before = await provider.getSchemaVersion();
|
||||
const steps = await provider.downgradeSchema(target);
|
||||
console.log(`Schema ${providerName}: ${before} -> ${target} (${steps} step(s))`);
|
||||
} catch (err) {
|
||||
console.error(`Downgrade failed: ${err.message}`);
|
||||
process.exitCode = 1;
|
||||
} finally {
|
||||
await provider.close();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user