npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

my-migrator

v1.0.2

Published

This is a tool for managing MySQL database migrations, written in TypeScript.

Downloads

9

Readme

MyMigrator

MyMigrator is a simple database migration tool for managing MySQL database schema changes in Node.js projects using mysql2/promise. It helps to ensure that database migrations are applied in order and prevents accidental modifications to previously run migrations.

Installation

You can install the migration tool as an npm package:

npm install my-migrator

Usage

1. Import the DbMigration class

import { DbMigration } from "my-migrator";
import { createPool } from "mysql2/promise";

2. Create a connection pool to your MySQL database

const pool = createPool({
  host: "localhost",
  user: "root",
  password: "password",
  database: "your_database",
  // multipleStatements: true, // Allows executing multiple SQL statements in a single query
});

3. Initialize the migration instance

The DbMigration class requires two arguments:

  • pool: The MySQL connection pool.
  • dir: The directory where your migration files are stored.
const migrationDir = path.join(__dirname, "migrations");
const dbMigration = new DbMigration(pool, migrationDir);

4. Create your migration files

Migration files must follow a specific naming convention for the tool to recognize and process them. The correct naming format is:

V<number>__<description>.sql

For example:

V1__create_table_users.sql
V2__add_column_email_to_users.sql

Each migration file should contain valid SQL statements for the database changes you want to apply.

Here’s how you can update the section with a warning to ensure the user understands that the application should stop running if a migration fails:


5. Run migrations

To apply the pending migrations, call the run() method of the DbMigration instance.

(async () => {
  try {
    await dbMigration.run();
  } catch (error) {
    console.error("Migration failed:", error);
  }
})();

Important: If an error occurs during the migration, do not edit or delete any existing migration files that have already been installed in the database. Instead, you should create a new migration file to fix the issue rather than modifying the one that caused the error. Editing an already-installed migration file will lead to the following error:

Error: Migrations have been edited after being installed in ⚠️ V3__create_post_table.sql⚠️
        🙏please revert the changes and try again

To resolve the error:

  1. Leave the problematic migration file as is.
  2. Create a new migration file that fixes the issue.
  3. Re-run the migration process to apply the new changes.

This ensures that the migration history remains consistent, preventing further errors and maintaining the integrity of the database.

Migration Details

  • Automatic Checksums: Each migration file's content is hashed using SHA256 and stored in the database to ensure no tampering occurs. If a previously installed migration file is edited or deleted, the tool will throw an error, preventing inconsistent migrations.
  • Schema History Table: A schema_history table is automatically created in the database to track applied migrations, their versions, file names, and checksums. Below is an example of the schema_history table:
mysql> select * from schema_history;

| version | file_name | check_sum | installed_by | installed_in | success | | ------- | --------------------------- | ---------------------------------------------------------------- | ------------ | ------------------- | ------- | | 1 | V1__create_test_table.sql | b4af9bdc0c7f329322cb1beb4413ba129acbc1fce4263828bf117dbd9ca218a6 | admin | 2024-09-08 16:19:34 | 1 | | 2 | V2__create_post_table.sql | be5f8428ee1311b9067b6176ae62794f3cdff552e846d8b906693b33c38ab428 | admin | 2024-09-08 16:19:34 | 0 | | 3 | V3__create_post_table.sql | 63115d3fe315f39956249a792a183bb905cd5b66e82432087febea49b424cd5c | admin | 2024-09-08 16:19:55 | 1 |


  • Columns Explained:
    • version: The version number of the migration.
    • file_name: The name of the migration file.
    • check_sum: The SHA256 hash of the migration file’s content to detect changes.
    • installed_by: The username that applied the migration (retrieved from environment variables or set as "unknown").
    • installed_in: The timestamp of when the migration was applied.
    • success: Whether the migration was applied successfully (1 for success, 0 for failure).

This table helps track all applied migrations, ensuring the integrity of the database schema.

Error Handling

If any of the migrations fail, the tool will:

  1. Print the error message to the console: The exact reason for the failure will be logged.
  2. Terminate the database connection: The tool will stop further migration execution and close the database connection.
  3. Require a new migration file: The failed migration will not be rolled back automatically. To fix the issue, you must create a new migration file rather than modifying or deleting the failed one.

Important: Once a migration fails:

  • Do not edit the migration file that caused the error.
  • Create a new migration file to resolve the issue.

Attempting to modify or delete the failed migration file will result in the following error when re-running the migration:

Error: Migrations have been edited after being installed in ⚠️ V2__create_post_table.sql⚠️
        🙏please revert the changes and try again

The migration process is designed this way to ensure the integrity of the database and maintain a clear history of changes.

Example of Running Migrations

Here's a full example of how to use the DbMigration tool:

import { DbMigration } from "my-migrator";
import { createPool } from "mysql2/promise";
import path from "path";

(async () => {
  const pool = createPool({
    host: "localhost",
    user: "root",
    password: "password",
    database: "my_database",
  });

  const migrationDir = path.join(__dirname, "migrations");

  const dbMigration = new DbMigration(pool, migrationDir);

  await dbMigration.run();
  await pool.end();
})();

Important Notes

  • File Naming: Make sure the migration files follow the V<number>__<description>.sql pattern. Any file that doesn't match this pattern will cause an error.
  • Checksum Integrity: Once a migration file is applied, do not modify its content. The tool compares checksums of installed migrations to detect any changes.
  • Database Schema Table: Ensure the schema_history table is created in the correct database. The tool handles this automatically, but it’s crucial to use the same database in your connection pool.

License

This project is licensed under the MIT License.


Contributing

Feel free to submit pull requests or open issues to improve this project.