feat(migration): 改用版本化迁移管理数据库变更
- 将声明式 schema.sql 改为期望状态定义 - 新增 migrations/ 目录存放版本化迁移文件 - 更新 atlas.hcl 配置支持版本化迁移路径 - 修改生成迁移脚本 generate-migration.sh 实现差异迁移文件生成 - Dockerfile 支持拷贝 migrations 目录 - docker-compose.yml 调整命令,使用迁移文件夹路径 - 优化 README 文档描述版本化迁移及使用步骤 - 移除无用测试数据库docker-compose.test.yml文件 - 添加初始的 baseline 迁移 SQL 文件,包含完整表结构创建语句
This commit is contained in:
@@ -1,8 +1,7 @@
|
||||
*.sh
|
||||
!migrate.sh
|
||||
.git
|
||||
.gitignore
|
||||
.env.local
|
||||
docker-compose.yml
|
||||
test-local.sh
|
||||
generate-migration.sh
|
||||
docker-compose*.yml
|
||||
CLAUDE.md
|
||||
.github
|
||||
|
||||
@@ -5,6 +5,7 @@ WORKDIR /app
|
||||
|
||||
COPY atlas.hcl .
|
||||
COPY schema.sql .
|
||||
COPY migrations/ ./migrations/
|
||||
|
||||
# 设置 ENTRYPOINT,使得容器启动时默认运行 Atlas
|
||||
ENTRYPOINT ["/atlas"]
|
||||
|
||||
30
README.md
30
README.md
@@ -1,30 +1,29 @@
|
||||
# Atlas 数据库迁移(声明式)
|
||||
# Atlas 数据库迁移(版本化)
|
||||
|
||||
## 文件说明
|
||||
|
||||
- `atlas.hcl` - Atlas 配置文件
|
||||
- `schema.sql` - 数据库 schema 定义(声明式)
|
||||
- `schema.sql` - 数据库 schema 定义(期望状态)
|
||||
- `migrations/` - 版本化迁移文件目录
|
||||
- `.env.local` - 本地环境配置
|
||||
- `.env.example` - 生产环境配置示例
|
||||
- `generate-migration.sh` - 从本地数据库导出 schema.sql
|
||||
- `migrate.sh` - 生产环境迁移脚本
|
||||
- `test-local.sh` - 本地测试脚本
|
||||
- `generate-migration.sh` - 生成新的迁移文件
|
||||
- `Dockerfile` - Docker 镜像配置
|
||||
- `docker-compose.yml` - Docker Compose 配置
|
||||
|
||||
## 使用步骤
|
||||
|
||||
### 1. 导出当前数据库 schema
|
||||
### 1. 修改 schema.sql 定义期望状态
|
||||
|
||||
直接编辑 `schema.sql` 文件,定义期望的数据库结构。
|
||||
|
||||
### 2. 生成迁移文件
|
||||
|
||||
```bash
|
||||
./generate-migration.sh
|
||||
```
|
||||
|
||||
### 2. 本地测试
|
||||
|
||||
```bash
|
||||
./test-local.sh
|
||||
```
|
||||
此命令会对比当前数据库和 schema.sql,生成新的迁移文件到 `migrations/` 目录。
|
||||
|
||||
### 3. 生产环境部署
|
||||
|
||||
@@ -51,12 +50,11 @@ docker-compose up db-migrate
|
||||
docker build -t db-migrate:latest .
|
||||
docker run --rm \
|
||||
-e DB_URL="mysql://user:password@host:3306/database" \
|
||||
db-migrate:latest
|
||||
db-migrate:latest migrate apply --url $DB_URL --dir file://migrations
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. 本地测试需修改 `.env.local` 中的 `MYSQL_CONTAINER` 为实际容器名称
|
||||
2. 生产环境需配置 `.env` 文件或设置环境变量
|
||||
3. 使用声明式迁移,schema.sql 是数据库最终状态
|
||||
4. Atlas 自动计算并执行差异变更
|
||||
1. 使用版本化迁移,每次修改 schema.sql 后需运行 `generate-migration.sh` 生成迁移文件
|
||||
2. 迁移文件会按顺序执行,确保数据库状态可追溯
|
||||
3. 生产环境需配置 `.env` 文件或设置环境变量
|
||||
|
||||
13
atlas.hcl
13
atlas.hcl
@@ -1,11 +1,22 @@
|
||||
env "local" {
|
||||
src = "file://schema.sql"
|
||||
url = "mysql://root:mysql123@localhost:3306/kami"
|
||||
dev = "mysql://root:mysql123@localhost:3306/atlas_dev"
|
||||
dev = "mysql://root:mysql123@localhost:3306/kami_dev"
|
||||
migration {
|
||||
dir = "file://migrations"
|
||||
}
|
||||
}
|
||||
|
||||
// 生产环境配置
|
||||
env "prod" {
|
||||
url = getenv("DB_URL")
|
||||
src = "file://schema.sql"
|
||||
migration {
|
||||
dir = "file://migrations"
|
||||
}
|
||||
|
||||
// 禁用schema scoping限制
|
||||
schema {
|
||||
mode = "database"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
# 测试数据库
|
||||
test-mysql:
|
||||
image: mysql:8.0
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: testpass
|
||||
MYSQL_DATABASE: testdb
|
||||
ports:
|
||||
- "13306:3306"
|
||||
healthcheck:
|
||||
test:
|
||||
[
|
||||
"CMD",
|
||||
"mysqladmin",
|
||||
"ping",
|
||||
"-h",
|
||||
"localhost",
|
||||
"-u",
|
||||
"root",
|
||||
"-ptestpass",
|
||||
]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
start_period: 30s
|
||||
|
||||
# 创建 testdb_dev 数据库
|
||||
create-dev-db:
|
||||
image: mysql:8.0
|
||||
command:
|
||||
[
|
||||
"sh",
|
||||
"-c",
|
||||
"sleep 10 && mysql -h test-mysql -u root -ptestpass -e 'CREATE DATABASE IF NOT EXISTS testdb_dev;'",
|
||||
]
|
||||
depends_on:
|
||||
test-mysql:
|
||||
condition: service_healthy
|
||||
|
||||
# 数据库迁移服务
|
||||
db-migrate:
|
||||
build: .
|
||||
command:
|
||||
- "schema"
|
||||
- "apply"
|
||||
- "--url"
|
||||
- "mysql://root:testpass@test-mysql:3306/testdb"
|
||||
- "--to"
|
||||
- "file://schema.sql"
|
||||
- "--dev-url"
|
||||
- "mysql://root:testpass@test-mysql:3306/testdb_dev"
|
||||
- "--auto-approve"
|
||||
depends_on:
|
||||
create-dev-db:
|
||||
condition: service_completed_successfully
|
||||
restart: "no"
|
||||
|
||||
@@ -5,12 +5,9 @@ services:
|
||||
build: .
|
||||
restart: "no"
|
||||
command:
|
||||
- "schema"
|
||||
- "migrate"
|
||||
- "apply"
|
||||
- "--url"
|
||||
- "mysql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}"
|
||||
- "--to"
|
||||
- "file://schema.sql"
|
||||
- "--dev-url"
|
||||
- "mysql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}"
|
||||
- "--auto-approve"
|
||||
- "--dir"
|
||||
- "file://migrations"
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
|
||||
set -e
|
||||
|
||||
echo "从本地数据库导出 schema.sql..."
|
||||
echo "生成新的迁移文件..."
|
||||
|
||||
atlas schema inspect \
|
||||
atlas migrate diff \
|
||||
--env local \
|
||||
--format '{{ sql . }}' > schema.sql
|
||||
|
||||
echo "schema.sql 生成完成!"
|
||||
wc -l schema.sql
|
||||
|
||||
echo "迁移文件生成完成!"
|
||||
ls -lh migrations/
|
||||
|
||||
0
migrations/.gitkeep
Normal file
0
migrations/.gitkeep
Normal file
1545
migrations/20251213191759_baseline.sql
Normal file
1545
migrations/20251213191759_baseline.sql
Normal file
File diff suppressed because it is too large
Load Diff
2
migrations/atlas.sum
Normal file
2
migrations/atlas.sum
Normal file
@@ -0,0 +1,2 @@
|
||||
h1:yKwtSWz2E43wQlAgD9VF1LPD2YUYBNod1107GuaiE2Q=
|
||||
20251213191759_baseline.sql h1:M2vrp2p6koWVC8Y3jzvTpNxq0S7l8nepYnFuJ2BhQac=
|
||||
Reference in New Issue
Block a user