К основному содержанию
скилл CX Codex

prisma-migration-assistant — скилл для Claude Code: что делает

Помогает планировать и проводить миграции Prisma без потери данных. Подходит для разделения колонок, смены типов и безопасного наполнения таблиц.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add patricio0312rev/skills --skill prisma-migration-assistant -a claude-code
Открыть на GitHub

Что делает prisma-migration-assistant

Скилл помогает обновлять schema.prisma и готовить SQL для сложных изменений в базе данных. Он разбирает типичные сценарии: безопасное добавление колонок, переименование полей, перенос данных и рискованную смену типов. Для каждого случая ассистент даёт чёткую последовательность шагов, чтобы приложение не сломалось во время деплоя.

Работа с миграцией идёт поэтапно. Сначала генерируется черновой файл командой prisma migrate dev с флагом --create-only. Затем добавляется SQL для переноса существующих записей. Если данных много, скилл предлагает обновлять строки пачками через скрипты с PrismaClient. Это снижает нагрузку на базу.

Для отката автор приводит отдельные SQL-инструкции, но прямо указывает на риск: при возврате назад заполненные данные сотрутся. Тестировать миграции предлагается через запуск npx prisma migrate deploy на тестовой базе. Без настроенной базы и переменной TEST_DATABASE_URL локальные тесты миграций не запустятся.

Какие задачи решает

  • спланировать разделение одного поля на несколько колонок без потери данных
  • сформировать SQL для безопасного переименования столбца в базе
  • написать скрипт поэтапного заполнения пропущенных значений
  • составить сценарий отката миграции схемы Prisma

Примеры запросов агенту

  • Помоги разделить поле name на firstName и lastName в схеме Prisma и подготовь SQL для переноса данных.
  • Составь безопасный план миграции для смены типа поля цены с Float на Decimal.
  • Напиши скрипт для пакетного заполнения дефолтной роли пользователей, у которых поле role пустое.

Как установить prisma-migration-assistant

1Через Skills CLI (Vercel)

npx skills add patricio0312rev/skills --skill prisma-migration-assistant -a claude-code

2Вручную: положить файлы

~/.claude/skills/prisma-migration-assistant/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/prisma-migration-assistant/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о prisma-migration-assistant

Как установить prisma-migration-assistant в Claude Code?

Выполните команду в терминале: npx skills add patricio0312rev/skills --skill prisma-migration-assistant -a claude-code.

Что делает prisma-migration-assistant?

Скилл помогает составлять безопасные сценарии миграций Prisma, генерировать промежуточный SQL и писать скрипты наполнения данных. Он также формирует шаги отката изменений при сбоях.

Как скилл предлагает тестировать миграции схемы?

Скилл использует запуск npx prisma migrate deploy на тестовой базе через переменную TEST_DATABASE_URL. В тестах проверяется корректность преобразования колонок и сохранение данных.

Исходный текст

SKILL.md · MIT
---
name: prisma-migration-assistant
description: Plans and executes safe Prisma schema migrations with data backfills, rollback strategies, and SQL preview. Handles complex schema changes including data transformations. Use for "Prisma migrations", "schema changes", "database migrations", or "data backfills".
---

# Prisma Migration Assistant

Plan and execute safe Prisma migrations with confidence.

## Migration Planning Workflow

```typescript
// 1. Update schema.prisma
model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  // NEW: Split name into firstName and lastName
  firstName String?
  lastName  String?
  // OLD: name      String  // Will remove this
  createdAt DateTime @default(now())
}

// 2. Create migration
// npx prisma migrate dev --name split_user_name --create-only

// 3. Review generated SQL
// 4. Add data migration
// 5. Test migration
// 6. Apply to production
```

## Migration Types

### 1. Additive Migration (Safe)

```prisma
// Adding new optional field - safe!
model Product {
  id          Int     @id @default(autoincrement())
  name        String
  description String?
  price       Float
  newField    String? // NEW - optional, no backfill needed
}
```

```bash
# Generate migration
npx prisma migrate dev --name add_product_new_field

# SQL generated:
# ALTER TABLE "Product" ADD COLUMN "newField" TEXT;
```

### 2. Column Rename (Needs Data Copy)

```prisma
model User {
  id         Int    @id @default(autoincrement())
  emailAddr  String @unique // Renamed from 'email'
}
```

```sql
-- migrations/20240115_rename_email/migration.sql

-- Step 1: Add new column
ALTER TABLE "User" ADD COLUMN "emailAddr" TEXT;

-- Step 2: Copy data
UPDATE "User" SET "emailAddr" = "email";

-- Step 3: Make new column required
ALTER TABLE "User" ALTER COLUMN "emailAddr" SET NOT NULL;

-- Step 4: Add unique constraint
CREATE UNIQUE INDEX "User_emailAddr_key" ON "User"("emailAddr");

-- Step 5: Drop old column
ALTER TABLE "User" DROP COLUMN "email";
```

### 3. Data Transformation (Complex)

```prisma
// Before: Single name field
// After: First and last name
model User {
  id        Int     @id @default(autoincrement())
  firstName String
  lastName  String
  // name   String  // Removed
}
```

```sql
-- migrations/20240115_split_name/migration.sql

-- Step 1: Add new columns
ALTER TABLE "User" ADD COLUMN "firstName" TEXT;
ALTER TABLE "User" ADD COLUMN "lastName" TEXT;

-- Step 2: Data migration (split name)
-- PostgreSQL
UPDATE "User"
SET
  "firstName" = SPLIT_PART("name", ' ', 1),
  "lastName" = CASE
    WHEN array_length(string_to_array("name", ' '), 1) > 1
    THEN array_to_string((string_to_array("name", ' '))[2:], ' ')
    ELSE ''
  END
WHERE "name" IS NOT NULL;

-- Step 3: Handle NULL values
UPDATE "User"
SET
  "firstName" = COALESCE("firstName", ''),
  "lastName" = COALESCE("lastName", '');

-- Step 4: Make columns required
ALTER TABLE "User" ALTER COLUMN "firstName" SET NOT NULL;
ALTER TABLE "User" ALTER COLUMN "lastName" SET NOT NULL;

-- Step 5: Drop old column
ALTER TABLE "User" DROP COLUMN "name";
```

### 4. Type Change (Risky)

```prisma
model Product {
  id    Int    @id @default(autoincrement())
  price Decimal @db.Decimal(10, 2) // Changed from Float
}
```

```sql
-- migrations/20240115_price_to_decimal/migration.sql

-- Step 1: Add new column with correct type
ALTER TABLE "Product" ADD COLUMN "price_new" DECIMAL(10,2);

-- Step 2: Copy and convert data
UPDATE "Product"
SET "price_new" = CAST("price" AS DECIMAL(10,2));

-- Step 3: Drop old column
ALTER TABLE "Product" DROP COLUMN "price";

-- Step 4: Rename new column
ALTER TABLE "Product" RENAME COLUMN "price_new" TO "price";

-- Step 5: Make NOT NULL if required
ALTER TABLE "Product" ALTER COLUMN "price" SET NOT NULL;
```

## Migration Sequencing

```markdown
# Migration Sequence: Add User Roles

## Phase 1: Additive (Week 1)

1. Add optional `role` field
2. Deploy application code that handles NULL roles
3. Backfill existing users with default role

## Phase 2: Enforcement (Week 2)

1. Make `role` field required
2. Deploy code that requires role on creation
3. Add database constraint

## Phase 3: Cleanup (Week 3)

1. Remove old permission checking code
2. Verify all users have roles
```

## Backfill Strategies

### Small Table (< 10k rows)

```typescript
// scripts/backfill-user-roles.ts
import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

async function backfillUserRoles() {
  const usersWithoutRoles = await prisma.user.findMany({
    where: { role: null },
  });

  console.log(`Backfilling ${usersWithoutRoles.length} users...`);

  // Single transaction for small dataset
  await prisma.$transaction(
    usersWithoutRoles.map((user) =>
      prisma.user.update({
        where: { id: user.id },
        data: { role: "USER" }, // Default role
      })
    )
  );

  console.log("✅ Backfill complete");
}

backfillUserRoles();
```

### Large Table (> 10k rows)

```typescript
// scripts/backfill-large-table.ts
async function backfillBatched() {
  const batchSize = 1000;
  let processed = 0;
  let hasMore = true;

  while (hasMore) {
    const batch = await prisma.user.findMany({
      where: { role: null },
      take: batchSize,
      select: { id: true },
    });

    if (batch.length === 0) {
      hasMore = false;
      break;
    }

    // Process batch
    await prisma.$transaction(
      batch.map((user) =>
        prisma.user.update({
          where: { id: user.id },
          data: { role: "USER" },
        })
      )
    );

    processed += batch.length;
    console.log(`Processed ${processed} users...`);

    // Rate limiting
    await new Promise((resolve) => setTimeout(resolve, 100));
  }

  console.log(`✅ Backfilled ${processed} users`);
}
```

## Rollback Guidance

```sql
-- migrations/20240115_add_role/rollback.sql

-- Rollback Step 1: Add back old structure (if needed)
ALTER TABLE "User" DROP COLUMN "role";

-- Rollback Step 2: Restore old logic
-- (Deploy previous application version)

-- Note: Data loss consideration
-- If you backfilled data, document what was lost
```

## Migration Testing

```typescript
// tests/migrations/split-name.test.ts
import { PrismaClient } from "@prisma/client";
import { execSync } from "child_process";

describe("Split name migration", () => {
  let prisma: PrismaClient;

  beforeAll(async () => {
    // Setup test database
    execSync("npx prisma migrate deploy", {
      env: { DATABASE_URL: process.env.TEST_DATABASE_URL },
    });
    prisma = new PrismaClient();
  });

  it("should split name correctly", async () => {
    // Create user with old schema
    await prisma.$executeRaw`
      INSERT INTO "User" (name) VALUES ('John Doe')
    `;

    // Run migration
    execSync("npx prisma migrate deploy");

    // Verify split
    const user = await prisma.user.findFirst();
    expect(user?.firstName).toBe("John");
    expect(user?.lastName).toBe("Doe");
  });

  it("should handle single name", async () => {
    await prisma.$executeRaw`
      INSERT INTO "User" (name) VALUES ('Madonna')
    `;

    execSync("npx prisma migrate deploy");

    const user = await prisma.user.findFirst({
      where: { firstName: "Madonna" },
    });
    expect(user?.lastName).toBe("");
  });
});
```

## Pre-Migration Checklist

```markdown
- [ ] Backup database
- [ ] Test migration on staging
- [ ] Verify data transformation logic
- [ ] Check for referential integrity issues
- [ ] Estimate migration time
- [ ] Plan rollback strategy
- [ ] Schedule maintenance window (if needed)
- [ ] Notify team of deployment
```

## SQL Preview Script

```bash
#!/bin/bash
# scripts/preview-migration.sh

echo "🔍 Previewing migration..."

# Create migration without applying
npx prisma migrate dev --name "$1" --create-only

# Show SQL
echo ""
echo "📄 Generated SQL:"
echo "=================="
cat prisma/migrations/*_$1/migration.sql

# Analyze impact
echo ""
echo "📊 Impact Analysis:"
echo "=================="
echo "Tables affected: $(cat prisma/migrations/*_$1/migration.sql | grep -c 'ALTER TABLE')"
echo "Rows to update: [Run COUNT query manually]"
echo "Estimated time: [Estimate based on table size]"
```

## Best Practices

1. **Create migration, don't apply**: Use `--create-only` flag
2. **Review SQL carefully**: Check generated migration
3. **Test on staging**: Always test before production
4. **Batch large updates**: Avoid locking tables
5. **Add before removing**: Additive migrations first
6. **Version application code**: Deploy code that handles both schemas
7. **Monitor performance**: Watch query times during migration
8. **Have rollback plan**: Document reversal steps

## Output Checklist

- [ ] Migration SQL generated and reviewed
- [ ] Data backfill strategy planned
- [ ] Rollback procedure documented
- [ ] Migration sequencing defined
- [ ] Testing plan created
- [ ] Impact analysis completed
- [ ] Staging deployment successful
- [ ] Production deployment scheduled

© patricio0312rev · MIT · patricio0312rev/skills

Похожие скиллы

Все скиллы по теме «Данные и базы» →
xlsx официальный anthropics Работает с табличными файлами: создаёт, читает, правит и преобразует книги. Подходит, когда итогом должен стать файл Excel или другой табличный формат. 187 223установок google-agents-cli-observability официальный Google Помогает настроить трассировку и сбор данных о работе ИИ-агентов, включая агентов на ADK. Пригодится, когда нужно разбирать выполнение запросов или наблюдать за агентом после развёртывания. CX Codex +1 511 300установок caveman-evidence-review JuliusBrussee Скилл читает данные Caveman Cloud о расходах LLM, трассах и маршрутизации. Подходит для проверки того, куда уходит бюджет проекта. CX Codex +1 104 500установок migration JuliusBrussee Скилл задаёт правила безопасных миграций схем, данных и API с обязательным откатом. Пригодится при изменениях, где нельзя терять данные или ломать совместимость. CX Codex +1 103 900установок performance-optimization addyosmani Скилл для агентов ИИ-кодинга: сначала замеряет, потом чинит узкое место — от Core Web Vitals до N+1 запросов и индексов в базе. CX Codex +1 65 200установок supabase официальный supabase Скилл помогает настраивать базу данных, аутентификацию и RLS в Supabase без скрытых дыр в безопасности. CX Codex GP ChatGPT 8установок

Из того же набора42

load-test-builder Собирает нагрузочные и стресс-тесты на k6, Artillery или autocannon и помогает встроить их в CI как проверку производительности. CX Codex +1 316установок core-web-vitals-tuner Скилл помогает улучшить показатели LCP, INP и CLS с помощью структурированных правок в коде. Они ускоряют рендеринг и отклик страниц. CX Codex +1 308установок structured-output-extractor Помогает извлекать из ответов LLM типизированные данные через JSON Schema, Zod и function calling. Нужен для парсинга JSON и проверки результата. CX Codex +1 308установок tailwind-gradient-builder Помогает генерировать линейные, радиальные, конические и mesh-градиенты на Tailwind CSS. Пригодится при вёрстке фонов, текста и анимаций. CX Codex +1 307установок secure-headers-csp-builder Добавляет HTTP-заголовки безопасности и CSP с переходом от отчётов к блокировке. Пригодится для защиты Express-приложения от XSS и небезопасных ресурсов. CX Codex +1 306установок openapi-generator Собирает спецификацию OpenAPI 3.0/3.1 из маршрутов Express, Next.js, Fastify, Hono или NestJS — со схемами, примерами и описаниями. CX Codex +1 306установок frontend-refactor-planner Составляет поэтапный план рефакторинга фронтенда: делит крупные компоненты, упрощает состояние и улучшает доступность. Пригодится при разборе легаси-кода. CX Codex +1 305установок api-test-suite-generator Скилл сканирует определения маршрутов и генерирует тесты API на Jest, Vitest или Supertest. Пригодится, когда эндпоинты уже есть, а тестов к ним нет. CX Codex +1 303установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой