在项目宪章中新增第九条原则"数据库设计原则",明确禁止使用数据库外键约束和ORM关联标签。 主要变更: - 新增原则IX:数据库设计原则(Database Design Principles) - 强制要求:数据库表不得使用外键约束 - 强制要求:GORM模型不得使用ORM关联标签(foreignKey、hasMany等) - 强制要求:表关系必须通过ID字段手动维护 - 强制要求:关联数据查询必须显式编写,避免ORM魔法 - 强制要求:时间字段由GORM处理,不使用数据库触发器 设计理念: - 提升业务逻辑灵活性(无数据库约束限制) - 优化高并发性能(无外键检查开销) - 增强代码可读性(显式查询,无隐式预加载) - 简化数据库架构和迁移流程 - 支持分布式和微服务场景 版本升级:2.3.0 → 2.4.0(MINOR)
118 lines
3.3 KiB
Bash
Executable File
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 "✓ 迁移操作完成"
|