A simple forwards only migration solution for postgres.js.
postgres-shift
postgres-shift exports a single function which is used to start migrations.
It expects a postgres.js sql database object to run migrations with.
- Create migrationsdirectory with following structure
.
└── migrations
    ├── 00001_initial
    │   └── index.sql
    ├── 00002_update
    │   └── index.js
    └── 00003_delete
        └── index.sql
Note that migration folder name expects 5 digits. This is very important detail.
- Create actual migrations. Note that it can be either in SQL or JS syntax
create table test (
  a text,
  b int
)export default async function(sql) {
  await sql`
    alter table test add column c timestamp with time zone
  `
  await sql`
    insert into test (a, b, c) values ('hello', 9, ${ new Date() })
  `
}- Create your migrate.jsscript:
import shift from 'postgres-shift';
import postgres from 'postgres';
import { fileURLToPath } from 'url';
const {
    DB_HOST,
    DB_PORT,
    DB_NAME,
    ADMIN_DB_USER,
    ADMIN_DB_PASSWORD,
} = process.env;
export const sql = postgres({
    host: DB_HOST,
    port: Number(DB_PORT),
    database: DB_NAME,
    user: ADMIN_DB_USER,
    pass: ADMIN_DB_PASSWORD,
    idle_timeout: 1,
});
shift({
    sql,
    path: fileURLToPath(new URL('migrations', import.meta.url)),
    before: ({ migration_id, name }) => {
        console.log('Migrating', migration_id, name);
    },
})
    .then(() => console.log('All good'))
    .catch((err) => {
        console.error('Failed', err);
        process.exit(1);
    });- Run it with
node ./migrate.js