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

@animiru/ani-migrate

v1.0.0

Published

PostgreSQL script migrator.

Downloads

9

Readme

ani-migrate

ani-migrate is a PostgreSQL migration package that allows for versioning to keep all database migrations clean and mess free!

This package is highly based off of pg-migrator with some enhancements.

Features

  • Forward and backwards migrations
  • Migration to a specifc version
  • Sub folder deep search
  • Transactional migration
  • No remote session required
  • Optional schema based versioning

Installation

npm install -g @animiru/ani-migrate

Quick Start

To keep things a little more organized ani-migrate requires there to be a dedicated directory for migrations. This directory can be named anything the only rule is it contains a file named .ani-migrate.

We will talk more about .ani-migrate later.

Example Hierarchy

project
  ├─ migrations
  │   ├─ .ani-migrate
  │   ├─ 1-2.sql
  │   ├─ 2-1.sql
  │   └─ ...
  ├─ src
  │   ├─ index.js
  │   └─ ...
  └─ package.json

Now with a migrations directory we can use the following command to migrate to the highest migration in our directory.

ani-migrate postgres://username:pass@host/somedb

More In Depth

As seen in the basic usage it is pretty simple to get started but we also offer some more in depth features.

Hierarchy

Above you saw an example hierarchy we provided. Well ani-migrate actually provides a deep sub folder search. Therefore you can organize your migrations directory however you please.

Advanced Hierarchy

project
  ├─ migrations
  │   ├─ .ani-migrate
  │   ├─ v1.0.0
  │   │   ├─ 1-2.sql
  │   │   ├─ 2-1.sql
  │   │   ├─ 2-3.sql
  │   │   └─ 3-2.sql
  │   ├─ v2.0.0
  │   │   ├─ 3-4.sql
  │   │   └─ 4-3.sql
  │   └─ ...
  ├─ src
  │   ├─ index.js
  │   └─ ...
  └─ package.json

Something as advanced as this would be 100% valid not to mention you can have sub folders inside of your sub folders to the power of infinity.

Steps

Another concern or issue you may have from above is "what if I want to migrate backwards?" or "what if a want to migrate 5 steps forward?". Well we have you 100% covered.

ani-migrate postgres://username:pass@host/somedb +1

Migrate up 1 step

ani-migrate postgres://username:pass@host/somedb -1

Migrate down 1 step

ani-migrate postgres://username:pass@host/somedb -5

Migrate to back 5 versions

ani-migrate postgres://username:pass@host/somedb 5

Migrate to migration 4-5.sql

.ani-migrate

This file is not as cool as it seems. It is used to config schema based migrations.

Example .ani-migrate

# ani-migrate config

As stated above, its not that interesting. It mainly stands as a landmark for what directory contains migrations and config for schema based migrations.

Migration Scripts

ani-migrate will utilize all migrations scripts located anywhere withing the migration folder that follow the format x-y.sql (case insensitive).

As stated above the migration scripts can be organized and categorized however you wish. ani-migrate will search all sub folders and sub folders of sub folders to the power of infinity.

Sample Migration Names

17-18.sql : Migration script from version 17 to version 18 for forward migration
18-17.sql : Migration script from version 18 to version 17 for backwards migration

NOTE

Your first migration needs to be 1-2.sql we do not start at 0!

Per Schema Migrations

Per schema migrations is one of the more interesting parts of this package.

A use case of this would be say you have two sub projects under one main project that need to access each others tables. Rather than creating two seperate databases and having two seperate connection. We can use schema based migrations to utilize the same database for multiple projects using migrations.

This may sound quite confusing so lets put it into example.

Project A

In project a we will have a service that constantly monitors youtube for new uploads and stores their links.

Hierarchy

yt-watcher
  ├─ migrations
  │   ├─ .ani-migrate
  │   ├─ 1-2.sql
  │   ├─ 2-1.sql
  │   └─ ...
  ├─ src
  │   ├─ index.js
  │   └─ ...
  └─ package.json

.ani-migrate

# ani-migrate config

schema=youtube

1-2.sql

CREATE SCHEMA IF NOT EXISTS youtube;

SET search_path TO youtube, public;

CREATE TABLE IF NOT EXISTS youtube.new_upload (
  "url": text NOT NULL,
  "uploaded" timestamp NOT NULL
);

2-1.sql

DROP SCHEMA IF EXISTS youtube CASCADE;
ani-migrate postgres://username:pass@host/testdb

Project A now has a config setup to tell ani-migrate to store the versioning table under the youtube schema and only version migrations for the youtube schema nothing else.

Project B

In this project we are reading the uploaded videos from teh database but we also need to store user info for people who login on our site.

Hierarchy

website
  ├─ migrations
  │   ├─ .ani-migrate
  │   ├─ 1-2.sql
  │   ├─ 2-1.sql
  │   └─ ...
  ├─ src
  │   ├─ index.js
  │   └─ ...
  └─ package.json

.ani-migrate

# ani-migrate config

schema=website

1-2.sql

CREATE SCHEMA IF NOT EXISTS website;

SET search_path TO website, public;

CREATE TABLE IF NOT EXISTS website.users (
  "username": varchar(32) NOT NULL,
  "password" varchar(64) NOT NULL
);

2-1.sql

DROP SCHEMA IF EXISTS website CASCADE;
ani-migrate postgres://username:pass@host/testdb

Now Project B also has its own table under the schema website on the same database testdb so we can have 1 connection to read youtube episodes and user info.

In Conclusion

Since we told ani-migrate in the config for each project to only utilize a specific schema, neither of the migrations will conflict.

Examples