What is drizzle-kit?
Drizzle-kit is an npm package designed to simplify database migrations and schema management for JavaScript and TypeScript applications. It provides a set of tools to create, manage, and apply database migrations in a structured and efficient manner.
What are drizzle-kit's main functionalities?
Create Migrations
This feature allows you to create new database migrations. The code sample demonstrates how to create a migration that adds a 'users' table with columns for 'id', 'name', 'email', and timestamps.
const { createMigration } = require('drizzle-kit');
createMigration('add-users-table', (migration) => {
migration.createTable('users', (table) => {
table.increments('id').primary();
table.string('name');
table.string('email').unique();
table.timestamps();
});
});
Apply Migrations
This feature allows you to apply all pending migrations to your database. The code sample shows how to apply migrations using the `applyMigrations` function.
const { applyMigrations } = require('drizzle-kit');
applyMigrations();
Rollback Migrations
This feature allows you to rollback the last applied migration. The code sample demonstrates how to rollback the most recent migration using the `rollbackMigration` function.
const { rollbackMigration } = require('drizzle-kit');
rollbackMigration();
List Migrations
This feature allows you to list all migrations, both applied and pending. The code sample shows how to list migrations using the `listMigrations` function.
const { listMigrations } = require('drizzle-kit');
listMigrations();
Other packages similar to drizzle-kit
knex
Knex.js is a SQL query builder for JavaScript that supports various database systems. It provides a powerful and flexible API for building and executing SQL queries, as well as managing database migrations. Compared to drizzle-kit, Knex.js offers more extensive query building capabilities but may have a steeper learning curve.
sequelize
Sequelize is a promise-based Node.js ORM for Postgres, MySQL, MariaDB, SQLite, and Microsoft SQL Server. It features solid transaction support, relations, eager and lazy loading, read replication, and more. While Sequelize offers a comprehensive ORM solution, drizzle-kit focuses specifically on database migrations and schema management.
typeorm
TypeORM is an ORM for TypeScript and JavaScript (ES7, ES6, ES5). It supports various databases and provides a robust set of features for managing database schemas and migrations. TypeORM is more feature-rich and supports advanced ORM functionalities, whereas drizzle-kit is more lightweight and focused on migrations.
Drizzle Kit
DrizzleKit - is a CLI migrator tool for DrizzleORM. It is probably one and only tool that lets you completely automatically generate SQL migrations and covers ~95% of the common cases like deletions and renames by prompting user input.
https://github.com/drizzle-team/drizzle-kit-mirror - is a mirror repository for issues.
Documentation
Check the full documenation on the website
How it works
drizzle-kit
will traverse schema folder
or schema file
, generate schema snapshot and compare it to the previous version, if there's one.
Based on the difference it will generate all needed SQL migrations and if there are any automatically unresolvable
cases like renames
it will prompt user for input.
For schema file:
import { integer, pgTable, serial, text, varchar } from "drizzle-orm/pg-core";
const users = pgTable("users", {
id: serial("id").primaryKey(),
fullName: varchar("full_name", { length: 256 }),
}, (table) => ({
nameIdx: index("name_idx", table.fullName),
})
);
export const authOtp = pgTable("auth_otp", {
id: serial("id").primaryKey(),
phone: varchar("phone", { length: 256 }),
userId: integer("user_id").references(() => users.id),
});
It will generate:
CREATE TABLE IF NOT EXISTS auth_otp (
"id" SERIAL PRIMARY KEY,
"phone" character varying(256),
"user_id" INT
);
CREATE TABLE IF NOT EXISTS users (
"id" SERIAL PRIMARY KEY,
"full_name" character varying(256)
);
DO $$ BEGIN
ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_fkey FOREIGN KEY ("user_id") REFERENCES users(id);
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
CREATE INDEX IF NOT EXISTS users_full_name_index ON users (full_name);
Installation & configuration
npm install -D drizzle-kit
Running with CLI options
// package.json
{
"scripts": {
"generate": "drizzle-kit generate --out migrations-folder --schema src/db/schema.ts"
}
}
npm run generate