68 lines
2.4 KiB
JavaScript
68 lines
2.4 KiB
JavaScript
const { Pool } = require('pg');
|
||
const fs = require('fs');
|
||
const path = require('path');
|
||
require('dotenv').config();
|
||
|
||
// Подключение к БД
|
||
const pool = new Pool({
|
||
connectionString: process.env.DATABASE_URL,
|
||
ssl: process.env.NODE_ENV === 'production' ? { rejectUnauthorized: false } : false
|
||
});
|
||
|
||
async function runMigrations() {
|
||
try {
|
||
console.log('Запуск миграций...');
|
||
|
||
// Создаем таблицу для отслеживания миграций, если её нет
|
||
await pool.query(`
|
||
CREATE TABLE IF NOT EXISTS migrations (
|
||
id SERIAL PRIMARY KEY,
|
||
name VARCHAR(255) NOT NULL,
|
||
applied_at TIMESTAMP DEFAULT NOW()
|
||
)
|
||
`);
|
||
|
||
// Получаем список уже примененных миграций
|
||
const { rows } = await pool.query('SELECT name FROM migrations');
|
||
const appliedMigrations = rows.map(row => row.name);
|
||
|
||
// Получаем список файлов миграций
|
||
const migrationsDir = path.join(__dirname, '../migrations');
|
||
const migrationFiles = fs.readdirSync(migrationsDir)
|
||
.filter(file => file.endsWith('.sql'))
|
||
.sort(); // Сортируем файлы по имени
|
||
|
||
// Применяем миграции, которые еще не были применены
|
||
for (const file of migrationFiles) {
|
||
if (!appliedMigrations.includes(file)) {
|
||
console.log(`Применение миграции: ${file}`);
|
||
|
||
// Читаем содержимое файла миграции
|
||
const filePath = path.join(migrationsDir, file);
|
||
const sql = fs.readFileSync(filePath, 'utf8');
|
||
|
||
// Выполняем SQL-запросы из файла
|
||
await pool.query(sql);
|
||
|
||
// Записываем информацию о примененной миграции
|
||
await pool.query(
|
||
'INSERT INTO migrations (name) VALUES ($1)',
|
||
[file]
|
||
);
|
||
|
||
console.log(`Миграция ${file} успешно применена`);
|
||
} else {
|
||
console.log(`Миграция ${file} уже применена`);
|
||
}
|
||
}
|
||
|
||
console.log('Все миграции успешно применены');
|
||
} catch (error) {
|
||
console.error('Ошибка при выполнении миграций:', error);
|
||
process.exit(1);
|
||
} finally {
|
||
await pool.end();
|
||
}
|
||
}
|
||
|
||
runMigrations();
|