umzug
SKILL.md
Umzug v3 — Claude Skill (Sequelize v7 Adapted)
Key Concepts
- Umzug is not an ORM — it orchestrates running/reverting migration functions and tracking which have been executed
- The
contextoption passes any value to every migration'sup/down— for Sequelize, usesequelize.getQueryInterface() SequelizeStoragetracks executed migrations in a database table (SequelizeMetaby default)- Migrations are discovered via glob patterns or provided as an inline array
- Built-in CLI via
umzug.runAsCLI()— supportsup,down,pending,executed,create - Import from
'umzug':Umzug,SequelizeStorage,JSONStorage,MongoDBStorage,memoryStorage,MigrationError
Sequelize v7 Specifics
- Import Sequelize from
@sequelize/core(notsequelize) - Import dialect classes:
PostgresDialect,SqliteDialect,MysqlDialect, etc. DataTypesfrom@sequelize/corefor migration column definitions- Sequelize v7 constructor takes a single options object (no URL string as first arg)
- CLS transactions enabled by default — use
sequelize.transaction()for managed,sequelize.startUnmanagedTransaction()for unmanaged dialectOptionsremoved — settings go in top-level options
Skill Files
| File | Contents |
|---|---|
| getting-started.md | Installation, Sequelize v7 setup, TypeScript config, context pattern, logging |
| migrations.md | Migration files, glob discovery, resolvers, SQL migrations, ordering, creating migrations, QueryInterface reference |
| storage.md | SequelizeStorage, JSONStorage, MemoryStorage, MongoDBStorage, custom storage |
| api-and-cli.md | up/down API, CLI commands, events, error handling, seeder pattern, transactions |
Quick Reference — Common Patterns
Migrator Entry Point (TypeScript + Sequelize v7)
import { Sequelize } from '@sequelize/core';
import { PostgresDialect } from '@sequelize/postgres';
import { Umzug, SequelizeStorage } from 'umzug';
const sequelize = new Sequelize({
dialect: PostgresDialect,
host: 'localhost',
port: 5432,
database: 'mydb',
user: 'user',
password: 'pass',
});
const umzug = new Umzug({
migrations: { glob: 'migrations/*.ts' },
context: sequelize.getQueryInterface(),
storage: new SequelizeStorage({ sequelize }),
logger: console,
});
export type Migration = typeof umzug._types.migration;
if (require.main === module) {
umzug.runAsCLI();
}
Migration File
import type { Migration } from '../migrator';
import { DataTypes } from '@sequelize/core';
export const up: Migration = async ({ context: queryInterface }) => {
await queryInterface.createTable('users', {
id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
name: { type: DataTypes.STRING, allowNull: false },
createdAt: { type: DataTypes.DATE, allowNull: false },
updatedAt: { type: DataTypes.DATE, allowNull: false },
});
};
export const down: Migration = async ({ context: queryInterface }) => {
await queryInterface.dropTable('users');
};
Run Migrations
await umzug.up(); // all pending
await umzug.up({ step: 2 }); // next 2
await umzug.up({ to: 'migration-name' }); // up to specific
await umzug.down(); // revert last
await umzug.down({ to: 0 }); // revert all
CLI Usage
npx tsx migrator.ts up
npx tsx migrator.ts down
npx tsx migrator.ts pending
npx tsx migrator.ts create --name create-posts.ts --folder migrations
Weekly Installs
2
Repository
totophe/skillsFirst Seen
5 days ago
Security Audits
Installed on
amp2
gemini-cli2
claude-code2
github-copilot2
codex2
kimi-cli2