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 delitions and renames by prompting user input.
https://github.com/drizzle-team/drizzle-kit-mirror - is a mirror repository for issues.
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're 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";
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
$ npm exec drizzle-kit generate --out migrations-folder --dialect pg --schema src/db/schema.ts
Or put your file to drizzle.config.json
configuration file:
{
"dialect": "pg",
"out": "./migrations-folder",
"schema": "./src/db"
}
List of commands
$ drizzle-kit generate
- generates SQL migrations based on .ts schema
--config
[optional defalut=drizzle.config.json] path to an optional config file
--dialect
[optional default=pg] database dialect, one of -> pg, mysql, sqlite
--schema
path to a schema file or folder with multiple schema files
--out
[optional default=drizzle/] place where to store migration files\
$ drizzle-kit generate
#
$ drizzle-kit generate --config custom.config.json
#
$ drizzle-kit generate --dialect pg --schema src/schema.ts
#
$ drizzle-kit generate --dialect .. --schema .. --out ./migration-folder
#
$ drizzle-kit up
- updates stale snapshots
--config
[optional defalut=drizzle.config.json] path to an optional config file
--dialect
[optional default=pg] database dialect, one of -> pg, mysql, sqlite
--schema
path to a schema file or folder with multiple schema files\
$ drizzle-kit check
- checks for collisions
--config
[optional defalut=drizzle.config.json] path to an optional config file
--dialect
[optional default=pg] database dialect, one of -> pg, mysql, sqlite
--schema
path to a schema file or folder with multiple schema files\