마이그레이션 (Migrations)
D1 데이터베이스 마이그레이션(버전 관리)에 대해 다루는 문서예요. 데이터베이스 개발 과정에서 변경 사항을 버전별로 저장하고 추적하는 방법을 알려줘요.
출처: 문서
본문
Migrations
데이터베이스 마이그레이션은 데이터베이스에 버전을 매기는 방법이에요. 각 마이그레이션은 migrations 폴더 안에 .sql 파일로 저장돼요. migrations 폴더는 첫 마이그레이션을 만들 때 프로젝트 디렉터리에 생성돼요. 이렇게 하면 데이터베이스 개발 과정에서 변경 사항을 저장하고 추적할 수 있어요.
기능 (Features)
현재 마이그레이션 시스템은 단순하지만 효과적이도록 설계됐어요. 현재 구현으로 다음과 같은 작업을 할 수 있어요.
migrations 폴더의 모든 마이그레이션 파일은 파일명에 지정된 버전 번호가 있어요. 파일은 순차적으로 나열돼요. 모든 마이그레이션 파일은 실행할 쿼리를 지정할 수 있는 SQL 파일이에요.
Wrangler 사용자 지정
기본적으로 마이그레이션은 Worker 프로젝트 디렉터리의 migrations/ 폴더에 생성돼요. 마이그레이션을 만들면 데이터베이스에 있는 d1_migrations 테이블에 적용된 마이그레이션 기록이 유지돼요.
이 위치와 테이블 이름은 Wrangler 파일의 D1 바인딩 안에서 사용자 지정할 수 있어요.
{
"d1_databases": [
{
"binding": "<BINDING_NAME>", // i.e. if you set this to "DB", it will be available in your Worker at `env.DB`
"database_name": "<DATABASE_NAME>",
"database_id": "<UUID>",
"preview_database_id": "<UUID>",
"migrations_table": "<d1_migrations>", // Customize this value to change your applied migrations table name
"migrations_dir": "<FOLDER_NAME>", // Specify your custom migration directory
"migrations_pattern": "<GLOB>" // Optional: discover migrations using a glob pattern (see below)
}
]
}
[[d1_databases]]
binding = "<BINDING_NAME>"
database_name = "<DATABASE_NAME>"
database_id = "<UUID>"
preview_database_id = "<UUID>"
migrations_table = "<d1_migrations>"
migrations_dir = "<FOLDER_NAME>"
migrations_pattern = "<GLOB>"
중첩 마이그레이션 레이아웃 (Nested migration layouts)
기본적으로 wrangler d1 migrations apply는 migrations_dir 안의 최상위 .sql 파일을 찾아요. Drizzle ↗︎ 같은 ORM을 사용해 각 마이그레이션을 별도의 하위 디렉터리(예: migrations/0001_init/migration.sql)로 작성한다면, migrations_pattern을 레이아웃에 맞는 glob으로 설정하세요.
{
"d1_databases": [
{
"binding": "DB",
"database_name": "my-database",
"database_id": "<UUID>",
"migrations_dir": "migrations",
"migrations_pattern": "migrations/*/migration.sql"
}
]
}
[[d1_databases]]
binding = "DB"
database_name = "my-database"
database_id = "<UUID>"
migrations_dir = "migrations"
migrations_pattern = "migrations/*/migration.sql"
migrations_pattern의 규칙:
- 설정하면
migrations_dir도 반드시 설정해야 해요. - 패턴은
migrations_dir에 설정된 값으로 시작해야 해요. - 각 마이그레이션의 이름은
migrations_dir기준 상대 경로(예:0001_init/migration.sql)로 마이그레이션 테이블에 기록돼요. 이렇게 하면 테이블이 다른 머신 간에 이식 가능해져요.
패턴은 표준 glob이에요. *는 한 경로 세그먼트와 일치하고, **는 임의 개수의 세그먼트와 일치해요. migrations/**/*.sql은 임의로 깊은 .sql 파일을 모두 선택해요.
wrangler d1 migrations create는 migrations_dir 안의 최상위 파일만 작성해요. 따라서 migrations_pattern이 중첩 파일만 일치한다면(Drizzle 레이아웃처럼), 대신 ORM의 명령(예: drizzle-kit generate)으로 새 마이그레이션을 생성하세요.
외래 키 제약 조건 (Foreign key constraints)
마이그레이션을 적용할 때 외래 키 제약 조건을 일시적으로 비활성화해야 할 수도 있어요. 그렇게 하려면 외래 키를 위반하는 변경을 하기 전에 PRAGMA defer_foreign_keys = true를 호출하세요.
외래 키와 D1을 다루는 방법에 대한 자세한 내용은 외래 키 문서를 참조하세요.