Files
junhong_cmp_fiber/scripts/migrate.sh
huang 984ccccc63 docs(constitution): 新增数据库设计原则(v2.4.0)
在项目宪章中新增第九条原则"数据库设计原则",明确禁止使用数据库外键约束和ORM关联标签。

主要变更:
- 新增原则IX:数据库设计原则(Database Design Principles)
- 强制要求:数据库表不得使用外键约束
- 强制要求:GORM模型不得使用ORM关联标签(foreignKey、hasMany等)
- 强制要求:表关系必须通过ID字段手动维护
- 强制要求:关联数据查询必须显式编写,避免ORM魔法
- 强制要求:时间字段由GORM处理,不使用数据库触发器

设计理念:
- 提升业务逻辑灵活性(无数据库约束限制)
- 优化高并发性能(无外键检查开销)
- 增强代码可读性(显式查询,无隐式预加载)
- 简化数据库架构和迁移流程
- 支持分布式和微服务场景

版本升级:2.3.0 → 2.4.0(MINOR)
2025-11-13 13:40:19 +08:00

118 lines
3.3 KiB
Bash
Executable File

#!/bin/bash
# 数据库迁移脚本
# 用法: ./scripts/migrate.sh [up|down|create|version|force] [args]
set -e
# 加载 .env 文件 (如果存在)
if [ -f .env ]; then
echo "正在加载 .env 文件..."
export $(grep -v '^#' .env | xargs)
fi
# 默认配置
MIGRATIONS_DIR="${MIGRATIONS_DIR:-migrations}"
DB_HOST="${DB_HOST:-localhost}"
DB_PORT="${DB_PORT:-5432}"
DB_USER="${DB_USER:-postgres}"
DB_PASSWORD="${DB_PASSWORD:-password}"
DB_NAME="${DB_NAME:-junhong_cmp}"
DB_SSLMODE="${DB_SSLMODE:-disable}"
# 构建数据库 URL
DATABASE_URL="postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?sslmode=${DB_SSLMODE}"
# 检查 migrate 命令是否存在
if ! command -v migrate &> /dev/null; then
echo "错误: migrate 命令未找到"
echo "请安装 golang-migrate:"
echo " brew install golang-migrate (macOS)"
echo " 或访问 https://github.com/golang-migrate/migrate/tree/master/cmd/migrate#installation"
exit 1
fi
# 显示使用说明
show_usage() {
cat << EOF
用法: $0 [命令] [参数]
命令:
up [N] 向上迁移 N 步 (默认: 全部)
down [N] 向下回滚 N 步 (默认: 1)
create NAME 创建新的迁移文件
version 显示当前迁移版本
force V 强制设置迁移版本为 V (用于修复脏数据库状态)
help 显示此帮助信息
环境变量:
DB_HOST 数据库主机 (默认: localhost)
DB_PORT 数据库端口 (默认: 5432)
DB_USER 数据库用户 (默认: postgres)
DB_PASSWORD 数据库密码 (默认: password)
DB_NAME 数据库名称 (默认: junhong_cmp)
DB_SSLMODE SSL 模式 (默认: disable)
示例:
$0 up # 应用所有迁移
$0 down 1 # 回滚最后一次迁移
$0 create add_sim_table # 创建新迁移文件
$0 version # 查看当前版本
$0 force 1 # 强制设置版本为 1
EOF
}
# 主命令处理
case "$1" in
up)
if [ -z "$2" ]; then
echo "正在应用所有迁移..."
migrate -path "$MIGRATIONS_DIR" -database "$DATABASE_URL" up
else
echo "正在向上迁移 $2 步..."
migrate -path "$MIGRATIONS_DIR" -database "$DATABASE_URL" up "$2"
fi
;;
down)
STEPS="${2:-1}"
echo "正在向下回滚 $STEPS 步..."
migrate -path "$MIGRATIONS_DIR" -database "$DATABASE_URL" down "$STEPS"
;;
create)
if [ -z "$2" ]; then
echo "错误: 请提供迁移文件名称"
echo "用法: $0 create <name>"
exit 1
fi
echo "创建迁移文件: $2"
migrate create -ext sql -dir "$MIGRATIONS_DIR" -seq "$2"
echo "迁移文件创建成功:"
ls -lt "$MIGRATIONS_DIR" | head -3
;;
version)
echo "当前迁移版本:"
migrate -path "$MIGRATIONS_DIR" -database "$DATABASE_URL" version
;;
force)
if [ -z "$2" ]; then
echo "错误: 请提供版本号"
echo "用法: $0 force <version>"
exit 1
fi
echo "强制设置迁移版本为: $2"
migrate -path "$MIGRATIONS_DIR" -database "$DATABASE_URL" force "$2"
;;
help|--help|-h)
show_usage
;;
*)
echo "错误: 未知命令 '$1'"
echo ""
show_usage
exit 1
;;
esac
echo "✓ 迁移操作完成"