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