# 历史一次性生产库迁移执行脚本 # 用途:只针对 20251206000000_add_soft_delete_and_favorites 迁移 # 状态:不是通用生产迁移入口,不属于当前 Git 增量部署流程 # 注意:执行前请确保已备份生产库! param( [string]$DatabaseUrl = $env:DATABASE_URL, [string]$MigrationFile = "d:\gongxiangp2\prisma\migrations\20251206000000_add_soft_delete_and_favorites\migration.sql", [string]$ContainerName = "gongxiangpan-postgres-1" ) if ([string]::IsNullOrWhiteSpace($DatabaseUrl)) { throw '缺少数据库连接,请先设置 DATABASE_URL 环境变量' } Write-Host "========================================" -ForegroundColor Cyan Write-Host "生产库迁移执行脚本" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan Write-Host "" # 检查迁移文件是否存在 if (-not (Test-Path $MigrationFile)) { Write-Host "❌ 错误:迁移文件不存在" -ForegroundColor Red Write-Host "路径:$MigrationFile" -ForegroundColor Red exit 1 } Write-Host "✅ 迁移文件已找到:$MigrationFile" -ForegroundColor Green Write-Host "" # 显示迁移内容摘要 Write-Host "📋 迁移内容摘要:" -ForegroundColor Yellow Write-Host " - 添加 materials.deletedAt 字段(软删除)" -ForegroundColor Yellow Write-Host " - 创建 material_favorites 表(收藏)" -ForegroundColor Yellow Write-Host " - 创建 material_logs 表(操作日志)" -ForegroundColor Yellow Write-Host " - 创建 material_download_logs 表(下载日志)" -ForegroundColor Yellow Write-Host "" # 提示用户确认 Write-Host "⚠️ 重要提示:" -ForegroundColor Yellow Write-Host " 1. 执行前请确保已备份生产库!" -ForegroundColor Yellow Write-Host " 2. 迁移过程中应避免用户操作" -ForegroundColor Yellow Write-Host " 3. 迁移失败可以回滚(使用备份恢复)" -ForegroundColor Yellow Write-Host "" $confirm = Read-Host "是否继续执行迁移?(yes/no)" if ($confirm -ne "yes") { Write-Host "❌ 已取消迁移" -ForegroundColor Red exit 0 } Write-Host "" Write-Host "🚀 开始执行迁移..." -ForegroundColor Cyan Write-Host "" # 检查 Docker 容器是否运行 try { $containerStatus = docker ps --filter "name=$ContainerName" --format "{{.Status}}" if ([string]::IsNullOrEmpty($containerStatus)) { Write-Host "⚠️ PostgreSQL 容器未运行,尝试启动..." -ForegroundColor Yellow docker start $ContainerName Start-Sleep -Seconds 3 } else { Write-Host "✅ PostgreSQL 容器已运行" -ForegroundColor Green } } catch { Write-Host "⚠️ 无法检查 Docker 容器,假设 PostgreSQL 可访问" -ForegroundColor Yellow } Write-Host "" # 执行迁移 try { Write-Host "📝 执行迁移 SQL 脚本..." -ForegroundColor Cyan # 方式1:通过 Docker 容器执行(推荐) $migrationContent = Get-Content -Path $MigrationFile -Raw $migrationContent | docker exec -i $ContainerName psql -U gongxiangpan -d lobechat if ($LASTEXITCODE -eq 0) { Write-Host "" Write-Host "✅ 迁移执行成功!" -ForegroundColor Green Write-Host "" Write-Host "📊 迁移结果:" -ForegroundColor Green Write-Host " - materials 表已添加 deletedAt 字段" -ForegroundColor Green Write-Host " - material_favorites 表已创建" -ForegroundColor Green Write-Host " - material_logs 表已创建" -ForegroundColor Green Write-Host " - material_download_logs 表已创建" -ForegroundColor Green Write-Host "" # 提示下一步 Write-Host "📋 下一步操作:" -ForegroundColor Cyan Write-Host " 1. 重新启动应用容器:docker restart youyidian-3d-material" -ForegroundColor Cyan Write-Host " 2. 重新生成 Prisma Client:npm run prisma:generate" -ForegroundColor Cyan Write-Host " 3. 测试下载功能是否正常" -ForegroundColor Cyan Write-Host "" exit 0 } else { Write-Host "" Write-Host "❌ 迁移执行失败!" -ForegroundColor Red Write-Host "请检查错误信息并重试" -ForegroundColor Red exit 1 } } catch { Write-Host "" Write-Host "❌ 执行迁移时出错:$_" -ForegroundColor Red Write-Host "" Write-Host "💡 故障排查:" -ForegroundColor Yellow Write-Host " 1. 检查 PostgreSQL 容器是否运行:docker ps | grep postgres" -ForegroundColor Yellow Write-Host " 2. 检查数据库连接:psql -h 192.168.58.20 -U gongxiangpan -d lobechat" -ForegroundColor Yellow Write-Host " 3. 查看容器日志:docker logs $ContainerName" -ForegroundColor Yellow Write-Host "" exit 1 }