Drizzle 1.0 GA로 마이그레이션하면서 schema에 index 추가했는데 prod에 적용 안 됩니다.
// schema.ts
export const posts = pgTable('posts', {
id: serial('id').primaryKey(),
slug: varchar('slug', { length: 200 }).notNull(),
authorId: integer('author_id').references(() => users.id),
createdAt: timestamp('created_at').defaultNow(),
}, (t) => ({
slugIdx: uniqueIndex('posts_slug_idx').on(t.slug),
authorIdx: index('posts_author_idx').on(t.authorId),
}))
drizzle-kit generate로 마이그레이션 만들고 prod에 apply 했는데 \di로 확인하니 index가 만들어지지 않았습니다.
SQL 파일은 정상으로 보이는데...
CREATE UNIQUE INDEX IF NOT EXISTS "posts_slug_idx" ON "posts" ("slug");
CREATE INDEX IF NOT EXISTS "posts_author_idx" ON "posts" ("author_id");
마이그레이션 실행 로그도 success.
댓글 3
몇 가지 가능성이 있습니다.
1. drizzle.config.ts에 migration 디렉토리 미스매치
가장 흔합니다. drizzle-kit이 보는 디렉토리와 migrate 함수가 실행하는 디렉토리가 다르면 일부 파일만 적용.
2. Neon의 branch가 prod 아닌 다른 branch에 적용
Neon은 multi-branch DB. 환경변수
DATABASE_URL이 다른 branch를 가리키면 의도와 다른 곳에 적용. Neon 대시보드에서 branch 별 schema 확인.3. drizzle.journal.json이 stale
./drizzle/meta/_journal.json이 이미 applied로 기록되어 있으면 drizzle-kit이 skip. 새 migration에 index 추가했어도 journal이 outdated면 무시.또는 journal 파일 직접 확인해서 마지막 applied tag 비교.
4. CREATE INDEX CONCURRENTLY 권장
큰 테이블에 index 추가하면서 잠금 회피하려면:
drizzle-kit이 자동 생성한 SQL은 CONCURRENTLY 안 붙입니다. 큰 테이블이면 수동 추가 권장.
1번이 가장 흔하니 거기서부터 확인해보세요.
저희도 같은 함정 — Neon에서 development branch 자동 생성된 거 모르고 거기에 migration 돌렸어요. Neon CLI로 모든 branch 한 번 확인하시는 게 좋습니다.