SPB Git
1.2 KB · 21 lines typescript
1import "./_env";2import { adminSql } from "./_admin-sql";3import { readdirSync, readFileSync } from "node:fs";4import { join } from "node:path";5import { createHash } from "node:crypto";6const sql = adminSql();7const dir = join(import.meta.dirname, "..", "drizzle");8const files = readdirSync(dir).filter((f) => /^\d{4}_.*\.sql$/.test(f)).sort();9await sql`CREATE TABLE IF NOT EXISTS schema_migrations (name text PRIMARY KEY, checksum text NOT NULL, applied_at timestamptz NOT NULL DEFAULT now())`;10const applied = new Map((await sql`SELECT name, checksum FROM schema_migrations`).map((r) => [r.name as string, r.checksum as string]));11let n = 0;12for (const f of files) {13  const body = readFileSync(join(dir, f), "utf8"); const sum = createHash("sha256").update(body).digest("hex");14  if (applied.has(f)) { if (applied.get(f) !== sum) console.warn(`! ${f} changed after being applied (checksum mismatch)`); continue; }15  console.log(`→ applying ${f}`);16  await sql.begin(async (tx) => { await tx.unsafe(body); await tx`INSERT INTO schema_migrations (name, checksum) VALUES (${f}, ${sum})`; });17  n++;18}19console.log(n ? `${n} migration(s) applied` : "schema up to date");20await sql.end();21
Files · f9849d608022d879d08dd07eebfa69fe13695a09
Menu

Theme