Home / File/ migrator.ts — drizzle-orm Source File

migrator.ts — drizzle-orm Source File

Architecture documentation for migrator.ts, a typescript file in the drizzle-orm codebase. 3 imports, 0 dependents.

File typescript DrizzleORM SQLDialects 3 imports 2 functions

Entity Profile

Dependency Diagram

graph LR
  9968bfac_85c0_4a20_fc14_94b2593d793b["migrator.ts"]
  04c2d726_fd72_4279_508e_4b3e799e7cea["driver.ts"]
  9968bfac_85c0_4a20_fc14_94b2593d793b --> 04c2d726_fd72_4279_508e_4b3e799e7cea
  e5e6906d_5758_78e9_01f9_fe38ab11030b["migrator.ts"]
  9968bfac_85c0_4a20_fc14_94b2593d793b --> e5e6906d_5758_78e9_01f9_fe38ab11030b
  944a2bed_8787_5f43_03e5_9a3b696c293c["index.ts"]
  9968bfac_85c0_4a20_fc14_94b2593d793b --> 944a2bed_8787_5f43_03e5_9a3b696c293c
  style 9968bfac_85c0_4a20_fc14_94b2593d793b fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

import type { MigrationMeta } from '~/migrator.ts';
import { sql } from '~/sql/index.ts';
import type { DrizzleSqliteDODatabase } from './driver.ts';

interface MigrationConfig {
	journal: {
		entries: { idx: number; when: number; tag: string; breakpoints: boolean }[];
	};
	migrations: Record<string, string>;
}

function readMigrationFiles({ journal, migrations }: MigrationConfig): MigrationMeta[] {
	const migrationQueries: MigrationMeta[] = [];

	for (const journalEntry of journal.entries) {
		const query = migrations[`m${journalEntry.idx.toString().padStart(4, '0')}`];

		if (!query) {
			throw new Error(`Missing migration: ${journalEntry.tag}`);
		}

		try {
			const result = query.split('--> statement-breakpoint').map((it) => {
				return it;
			});

			migrationQueries.push({
				sql: result,
				bps: journalEntry.breakpoints,
				folderMillis: journalEntry.when,
				hash: '',
			});
		} catch {
			throw new Error(`Failed to parse migration: ${journalEntry.tag}`);
		}
	}

	return migrationQueries;
}

export async function migrate<
	TSchema extends Record<string, unknown>,
>(
	db: DrizzleSqliteDODatabase<TSchema>,
	config: MigrationConfig,
): Promise<void> {
	const migrations = readMigrationFiles(config);

	db.transaction((tx) => {
		try {
			const migrationsTable = '__drizzle_migrations';

			const migrationTableCreate = sql`
				CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (
					id SERIAL PRIMARY KEY,
					hash text NOT NULL,
					created_at numeric
				)
			`;
			db.run(migrationTableCreate);

			const dbMigrations = db.values<[number, string, string]>(
				sql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`,
			);

			const lastDbMigration = dbMigrations[0] ?? undefined;

			for (const migration of migrations) {
				if (!lastDbMigration || Number(lastDbMigration[2])! < migration.folderMillis) {
					for (const stmt of migration.sql) {
						db.run(sql.raw(stmt));
					}
					db.run(
						sql`INSERT INTO ${
							sql.identifier(migrationsTable)
						} ("hash", "created_at") VALUES(${migration.hash}, ${migration.folderMillis})`,
					);
				}
			}
		} catch (error: any) {
			tx.rollback();
			throw error;
		}
	});
}

Domain

Subdomains

Dependencies

Frequently Asked Questions

What does migrator.ts do?
migrator.ts is a source file in the drizzle-orm codebase, written in typescript. It belongs to the DrizzleORM domain, SQLDialects subdomain.
What functions are defined in migrator.ts?
migrator.ts defines 2 function(s): migrate, readMigrationFiles.
What does migrator.ts depend on?
migrator.ts imports 3 module(s): driver.ts, index.ts, migrator.ts.
Where is migrator.ts in the architecture?
migrator.ts is located at drizzle-orm/src/durable-sqlite/migrator.ts (domain: DrizzleORM, subdomain: SQLDialects, directory: drizzle-orm/src/durable-sqlite).

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free