#!/bin/bash # 修复 wang@example.com 用户的成员代数数据 SSH_HOST="180.76.240.104-root" REMOTE_DIR="/var/www/chinese-family-tree" DB_NAME="family_tree" echo "=========================================" echo "修复 wang@example.com 用户的成员代数数据" echo "=========================================" # 在服务器上执行 SQL 查询和修复 ssh $SSH_HOST bash << 'ENDSSH' cd /var/www/chinese-family-tree echo "" echo "1. 查询当前数据状态..." echo "" sudo -u postgres psql -d family_tree << 'SQLEOF' -- 查看 wang@example.com 用户信息 SELECT id, email, name FROM "User" WHERE email = 'wang@example.com'; -- 查看该用户的家族树 SELECT ft.id, ft.name, ft."rootMemberId", ft."ownerId" FROM "FamilyTree" ft JOIN "User" u ON ft."ownerId" = u.id WHERE u.email = 'wang@example.com'; -- 查看成员代数分布 SELECT fm.generation, COUNT(*) as count, STRING_AGG(fm."fullName", ', ' ORDER BY fm."createdAt") as members FROM "FamilyMember" fm JOIN "FamilyTree" ft ON fm."treeId" = ft.id JOIN "User" u ON ft."ownerId" = u.id WHERE u.email = 'wang@example.com' GROUP BY fm.generation ORDER BY fm.generation; SQLEOF echo "" echo "2. 检查是否需要修复..." echo "" # 获取最小代数 MIN_GEN=$(sudo -u postgres psql -d family_tree -t -A -c " SELECT MIN(fm.generation) FROM \"FamilyMember\" fm JOIN \"FamilyTree\" ft ON fm.\"treeId\" = ft.id JOIN \"User\" u ON ft.\"ownerId\" = u.id WHERE u.email = 'wang@example.com'; ") echo "当前最小代数: $MIN_GEN" if [ "$MIN_GEN" -gt 1 ]; then OFFSET=$((MIN_GEN - 1)) echo "需要将所有代数减少 $OFFSET" echo "" echo "3. 执行修复..." sudo -u postgres psql -d family_tree << SQLEOF -- 开始事务 BEGIN; -- 更新所有成员的代数 UPDATE "FamilyMember" fm SET generation = generation - $OFFSET FROM "FamilyTree" ft, "User" u WHERE fm."treeId" = ft.id AND ft."ownerId" = u.id AND u.email = 'wang@example.com'; -- 查看修复后的结果 SELECT fm.generation, COUNT(*) as count, STRING_AGG(fm."fullName", ', ' ORDER BY fm."createdAt") as members FROM "FamilyMember" fm JOIN "FamilyTree" ft ON fm."treeId" = ft.id JOIN "User" u ON ft."ownerId" = u.id WHERE u.email = 'wang@example.com' GROUP BY fm.generation ORDER BY fm.generation; -- 提交事务 COMMIT; SQLEOF echo "" echo "✅ 修复完成!" else echo "✅ 代数正常(从第1世开始),无需修复" fi ENDSSH echo "" echo "=========================================" echo "修复脚本执行完成" echo "========================================="