chore: finalize amount migration fixes

This commit is contained in:
yml
2026-06-09 17:45:29 +08:00
parent 38c0ba69dc
commit 87673288ef
16 changed files with 214 additions and 2327 deletions
+15 -71
View File
@@ -5,7 +5,6 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
COMPOSE_FILE="${ROOT_DIR}/deploy/docker-compose.prod.yml"
BACKEND_ENV="${ROOT_DIR}/backend/.env"
BACKEND_LOG_DIR="${ROOT_DIR}/backend/logs"
MIGRATIONS_DIR="${ROOT_DIR}/backend/migrations"
HEALTH_URL="${PROD_HEALTH_URL:-http://127.0.0.1:7890/api/health}"
PUBLIC_URL="${PROD_PUBLIC_URL:-http://hfb.221329.cc.cd:7890}"
READY_TIMEOUT="${PROD_READY_TIMEOUT:-120}"
@@ -62,7 +61,7 @@ show_help() {
选项:
--no-build 不重新构建镜像,仅启动已有镜像
--no-migrate 不执行数据库迁移
--reset-db 重置数据库(删除并重建,自动清理旧迁移记录
--reset-db 重置数据库(删除并重建)
--logs 部署完成后跟随查看后端日志
-h, --help 显示帮助信息
@@ -196,55 +195,24 @@ wait_service_healthy() {
exit 1
}
mysql_exec() {
compose exec -T mysql sh -c 'MYSQL_PWD="$MYSQL_PASSWORD" mysql -u"$MYSQL_USER" "$@"' sh "$@"
}
mysql_root_exec() {
compose exec -T mysql sh -c 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" mysql -uroot "$@"' sh "$@"
}
mysql_scalar() {
mysql_exec -N -s "$(require_env MYSQL_DATABASE)" -e "$1"
}
ensure_migration_table() {
mysql_exec "$(require_env MYSQL_DATABASE)" <<'SQL'
CREATE TABLE IF NOT EXISTS schema_migrations (
version VARCHAR(255) PRIMARY KEY,
applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
SQL
}
clean_legacy_migrations() {
local has_legacy
has_legacy="$(mysql_scalar "SELECT COUNT(*) FROM schema_migrations WHERE version IN ('000002_payment_refund_schema', '000003_add_indexes', '000004_add_support_status', '000005_add_announcements', '000006_insert_sample_announcements', '000007_add_announcement_permissions', '000008_fix_announcement_charset', '000002_add_withdrawal_tables', '000003_add_encrypted_realname_fields');")"
if [[ "${has_legacy}" != "0" ]]; then
log_warn "检测到旧的迁移记录,正在清理..."
mysql_exec "$(require_env MYSQL_DATABASE)" -e \
"DELETE FROM schema_migrations WHERE version IN ('000002_payment_refund_schema', '000003_add_indexes', '000004_add_support_status', '000005_add_announcements', '000006_insert_sample_announcements', '000007_add_announcement_permissions', '000008_fix_announcement_charset', '000002_add_withdrawal_tables', '000003_add_encrypted_realname_fields');"
log_success "已清理旧迁移记录"
goose_dsn() {
local dsn="$1"
if [[ "${dsn}" != *"multiStatements="* ]]; then
if [[ "${dsn}" == *"?"* ]]; then
dsn="${dsn}&multiStatements=true"
else
dsn="${dsn}?multiStatements=true"
fi
fi
printf "%s" "${dsn}"
}
bootstrap_existing_schema_history() {
local migration_count users_exists
migration_count="$(mysql_scalar "SELECT COUNT(*) FROM schema_migrations;")"
users_exists="$(mysql_scalar "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'users';")"
if [[ "${migration_count}" == "0" && "${users_exists}" != "0" ]]; then
log_warn "检测到已有表结构但没有迁移记录,补记当前所有迁移文件为已应用"
local file version
shopt -s nullglob
for file in "${MIGRATIONS_DIR}"/*.sql; do
version="$(basename "${file}" .sql)"
mysql_exec "$(require_env MYSQL_DATABASE)" -e \
"INSERT IGNORE INTO schema_migrations (version) VALUES ('${version}');"
done
shopt -u nullglob
fi
goose_cmd() {
compose run --rm --no-deps backend /app/goose -dir /app/migrations mysql "$(goose_dsn "$(require_env MYSQL_DSN)")" "$@"
}
reset_database() {
@@ -259,7 +227,7 @@ reset_database() {
exit 1
fi
log_warn "重置数据库 ${database}(会清理旧迁移记录)..."
log_warn "重置数据库 ${database}..."
mysql_root_exec -e \
"DROP DATABASE IF EXISTS \`${database}\`; CREATE DATABASE \`${database}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
log_success "数据库已重建"
@@ -271,32 +239,8 @@ run_migrations() {
return 0
fi
log "执行数据库迁移..."
ensure_migration_table
bootstrap_existing_schema_history
# 只有在数据库未重置的情况下才需要清理旧迁移记录
if [[ "${RESET_DB}" != "1" ]]; then
clean_legacy_migrations
fi
local file version applied
shopt -s nullglob
for file in "${MIGRATIONS_DIR}"/*.sql; do
version="$(basename "${file}" .sql)"
applied="$(mysql_scalar "SELECT COUNT(*) FROM schema_migrations WHERE version = '${version}';")"
if [[ "${applied}" != "0" ]]; then
log "跳过已应用迁移:${version}"
continue
fi
log "导入迁移:${version}"
mysql_exec "$(require_env MYSQL_DATABASE)" < "${file}"
mysql_exec "$(require_env MYSQL_DATABASE)" -e \
"INSERT INTO schema_migrations (version) VALUES ('${version}');"
done
shopt -u nullglob
log "使用 goose 执行数据库迁移..."
goose_cmd up
log_success "数据库迁移完成"
}