1.0.1 • Published 4 years ago
@htc-class/simple-migrations v1.0.1
Simple Migrations
A barebones MySQL migration runner, that only works with
@htc-class/simple-mysql
Installation
npm install @htc-class/simple-migrationsSetting up Migrations
You must create a folder in your project directory with the path ./src/migrations. Then,
in that folder, start adding migration files, like the one shown below:
// ./src/migrations/01_CreateUserTable.ts
import { Migration } from '@htc-class/simple-migrations';
import SimpleSQL from '@htc-class/simple-mysql';
export default class CreateUserTable implements Migration {
  async up(db: SimpleSQL): Promise<void> {
    await db.mutate(/* sql */ `
      CREATE TABLE users (
        name TEXT NOT NULL,
        age INT NOT NULL,
        has_beard BOOLEAN NOT NULL,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
      );
    `);
  }
  async down(db: SimpleSQL): Promise<void> {
    await db.mutate(/* sql */ `DROP TABLE users;`);
  }
}The migrations will be ordered by the alphabetical filesystem order, so it's recommended to prefix your filenames with a number or date, to keep them in order, like this:
./src/
  migrations/
    _db-provider.ts
    01_CreateUserTable.ts
    02_CreateCardsTable.ts
    03_AddUserForeignKey.ts
    ...etc...Creating the Database Provider
In the ./src/migrations/ folder, you also must provide a file named exactly
_db-provider.ts that exports a single function which provides an authenticated DB
instance. Here's a template:
// ./src/migrations/_db-provider.ts
import { DbProvider } from '@htc-class/simple-migrations';
import SimpleMySQL from '@htc-class/simple-mysql';
const dbProvider: DbProvider = () => {
  // or, import a configured instance from another file (if you have one)
  // and just export that, to avoid duplication
  return new SimpleMySQL({
    database: process.env.DATABASE_NAME ?? ``,
    user: process.env.DATABASE_USER ?? ``,
    password: process.env.DATABASE_PASSWORD ?? ``,
  });
};
export default dbProvider;Running Migrations
The library exposes an npm binary called simple-migrate, allowing for 5 commands, as
shown here:
npx simple-migrate up:all   # run all pending migrations "up"
npx simple-migrate up:one   # run ONE pending migration "up"
npx simple-migrate down:all # run all pending migrations "down"
npx simple-migrate down:one # run ONE pending migration "down"
npx simple-migrate reset    # same as running `down:all` and then `up:all`