db-migrate

0.11.14 · maintenance · verified Sun Apr 19

db-migrate is a robust database migration framework for Node.js, designed to manage schema changes across various SQL database systems. Its current stable version is 0.11.14, released in late 2019, with a `v1.0.0-beta.0` also from 2019. The project is currently in a maintenance phase, with ongoing commits to the GitHub repository but no new stable releases for several years. It supports a wide array of databases including PostgreSQL, MySQL, SQLite, and MSSQL, requiring separate driver packages for each. A key differentiator is its dual interface: a powerful command-line tool for everyday use and a comprehensive programmatic API for deeper integration into application deployment and testing workflows. It ensures transactional integrity for migrations and offers clear 'up' and 'down' scripts for reliable schema evolution and rollback capabilities.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates the programmatic use of db-migrate to define and run both 'up' and 'down' migrations against an in-memory SQLite database, cleaning up all generated files afterward.

import DBMigrate from 'db-migrate';
import path from 'path';
import fs from 'fs';

async function runExampleMigrations() {
  const migrationsDirPath = path.join(__dirname, 'migrations');
  // Ensure migrations directory exists for db-migrate to scan
  if (!fs.existsSync(migrationsDirPath)) {
    fs.mkdirSync(migrationsDirPath);
  }

  // Create a simple migration file (up and down)
  const migrationName = `create-test-table-${Date.now()}`;
  const migrationFilePath = path.join(migrationsDirPath, `${migrationName}.js`);
  const migrationContent = `
    'use strict';
    var dbm;
    var type;
    var seed;

    exports.setup = function(options) {
      dbm = options.dbmigrate;
      type = options.type;
      seed = options.seed;
    };

    exports.up = function(db) {
      console.log('Running UP migration: ${migrationName}');
      return db.createTable('test_table', {
        id: { type: 'int', primaryKey: true, autoIncrement: true },
        value: { type: 'string', length: 255 }
      });
    };

    exports.down = function(db) {
      console.log('Running DOWN migration: ${migrationName}');
      return db.dropTable('test_table');
    };

    exports._meta = {
      "version": 1
    };
  `;
  fs.writeFileSync(migrationFilePath, migrationContent);
  console.log(`Generated migration file: ${migrationName}.js`);

  // Create a minimal database.json for an in-memory SQLite database
  const configPath = path.join(__dirname, 'database.json');
  const dbConfig = {
    "dev": {
      "driver": "sqlite3",
      "filename": ":memory:", // Use in-memory SQLite for easy testing
      "host": "localhost", // Required by some db-migrate internals even for sqlite3
      "database": "testdb" // Required by some db-migrate internals
    }
  };
  fs.writeFileSync(configPath, JSON.stringify(dbConfig, null, 2));
  console.log('Generated database.json for in-memory SQLite.');

  let dbmigrate;
  try {
    // Initialize db-migrate with options
    dbmigrate = DBMigrate.getInstance(true, {
      cwd: __dirname, // Important for db-migrate to find config and migrations
      env: 'dev'
    });

    console.log('\n--- Running UP migrations ---');
    await dbmigrate.up();
    console.log('UP migrations complete.');

    console.log('\n--- Running DOWN migrations ---');
    await dbmigrate.down();
    console.log('DOWN migrations complete.');

  } catch (error) {
    console.error('Migration failed:', error);
    process.exit(1);
  } finally {
    // Cleanup generated files
    if (fs.existsSync(migrationFilePath)) {
      fs.unlinkSync(migrationFilePath);
    }
    if (fs.existsSync(configPath)) {
      fs.unlinkSync(configPath);
    }
    if (fs.existsSync(migrationsDirPath)) {
      fs.rmdirSync(migrationsDirPath, { recursive: true });
    }
  }
}

runExampleMigrations();

view raw JSON →