remove sync alter true, add pending migration check
This commit is contained in:
@@ -353,8 +353,8 @@ async function main() {
|
|||||||
const command = args[0];
|
const command = args[0];
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Sync database
|
// Verify database connection
|
||||||
await sequelize.sync();
|
await sequelize.authenticate();
|
||||||
|
|
||||||
if (!command || command === "help") {
|
if (!command || command === "help") {
|
||||||
console.log(`
|
console.log(`
|
||||||
|
|||||||
@@ -165,10 +165,23 @@ app.use(sanitizeError);
|
|||||||
|
|
||||||
const PORT = process.env.PORT || 5000;
|
const PORT = process.env.PORT || 5000;
|
||||||
|
|
||||||
|
const { checkPendingMigrations } = require("./utils/checkMigrations");
|
||||||
|
|
||||||
sequelize
|
sequelize
|
||||||
.sync({ alter: true })
|
.authenticate()
|
||||||
.then(async () => {
|
.then(async () => {
|
||||||
logger.info("Database synced successfully");
|
logger.info("Database connection established successfully");
|
||||||
|
|
||||||
|
// Check for pending migrations
|
||||||
|
const pendingMigrations = await checkPendingMigrations(sequelize);
|
||||||
|
if (pendingMigrations.length > 0) {
|
||||||
|
logger.error(
|
||||||
|
`Found ${pendingMigrations.length} pending migration(s). Please run 'npm run db:migrate'`,
|
||||||
|
{ pendingMigrations }
|
||||||
|
);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
logger.info("All migrations are up to date");
|
||||||
|
|
||||||
// Initialize email services and load templates
|
// Initialize email services and load templates
|
||||||
try {
|
try {
|
||||||
@@ -209,8 +222,9 @@ sequelize
|
|||||||
});
|
});
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
logger.error("Unable to sync database", {
|
logger.error("Unable to connect to database", {
|
||||||
error: err.message,
|
error: err.message,
|
||||||
stack: err.stack,
|
stack: err.stack,
|
||||||
});
|
});
|
||||||
|
process.exit(1);
|
||||||
});
|
});
|
||||||
|
|||||||
96
backend/utils/checkMigrations.js
Normal file
96
backend/utils/checkMigrations.js
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check for pending database migrations
|
||||||
|
*
|
||||||
|
* Compares migration files in the filesystem against the SequelizeMeta table
|
||||||
|
* to determine which migrations have not yet been executed.
|
||||||
|
*
|
||||||
|
* @param {Sequelize} sequelize - Sequelize instance
|
||||||
|
* @returns {Promise<string[]>} Array of pending migration filenames
|
||||||
|
*/
|
||||||
|
async function checkPendingMigrations(sequelize) {
|
||||||
|
const migrationsPath = path.resolve(__dirname, "..", "migrations");
|
||||||
|
|
||||||
|
// Get all migration files from filesystem
|
||||||
|
const migrationFiles = fs
|
||||||
|
.readdirSync(migrationsPath)
|
||||||
|
.filter((file) => file.endsWith(".js"))
|
||||||
|
.sort();
|
||||||
|
|
||||||
|
// Check if SequelizeMeta table exists
|
||||||
|
const [results] = await sequelize.query(`
|
||||||
|
SELECT EXISTS (
|
||||||
|
SELECT FROM information_schema.tables
|
||||||
|
WHERE table_schema = 'public'
|
||||||
|
AND table_name = 'SequelizeMeta'
|
||||||
|
) as exists
|
||||||
|
`);
|
||||||
|
|
||||||
|
if (!results[0].exists) {
|
||||||
|
// No migrations have ever been run
|
||||||
|
return migrationFiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get executed migrations from SequelizeMeta
|
||||||
|
const [executedMigrations] = await sequelize.query(
|
||||||
|
'SELECT name FROM "SequelizeMeta" ORDER BY name'
|
||||||
|
);
|
||||||
|
|
||||||
|
const executedSet = new Set(executedMigrations.map((row) => row.name));
|
||||||
|
|
||||||
|
// Find migrations that haven't been executed
|
||||||
|
const pendingMigrations = migrationFiles.filter(
|
||||||
|
(file) => !executedSet.has(file)
|
||||||
|
);
|
||||||
|
|
||||||
|
return pendingMigrations;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get migration status summary
|
||||||
|
*
|
||||||
|
* @param {Sequelize} sequelize - Sequelize instance
|
||||||
|
* @returns {Promise<{executed: string[], pending: string[]}>} Migration status
|
||||||
|
*/
|
||||||
|
async function getMigrationStatus(sequelize) {
|
||||||
|
const migrationsPath = path.resolve(__dirname, "..", "migrations");
|
||||||
|
|
||||||
|
const migrationFiles = fs
|
||||||
|
.readdirSync(migrationsPath)
|
||||||
|
.filter((file) => file.endsWith(".js"))
|
||||||
|
.sort();
|
||||||
|
|
||||||
|
// Check if SequelizeMeta table exists
|
||||||
|
const [results] = await sequelize.query(`
|
||||||
|
SELECT EXISTS (
|
||||||
|
SELECT FROM information_schema.tables
|
||||||
|
WHERE table_schema = 'public'
|
||||||
|
AND table_name = 'SequelizeMeta'
|
||||||
|
) as exists
|
||||||
|
`);
|
||||||
|
|
||||||
|
if (!results[0].exists) {
|
||||||
|
return {
|
||||||
|
executed: [],
|
||||||
|
pending: migrationFiles,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const [executedMigrations] = await sequelize.query(
|
||||||
|
'SELECT name FROM "SequelizeMeta" ORDER BY name'
|
||||||
|
);
|
||||||
|
|
||||||
|
const executedSet = new Set(executedMigrations.map((row) => row.name));
|
||||||
|
|
||||||
|
return {
|
||||||
|
executed: migrationFiles.filter((file) => executedSet.has(file)),
|
||||||
|
pending: migrationFiles.filter((file) => !executedSet.has(file)),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
checkPendingMigrations,
|
||||||
|
getMigrationStatus,
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user