fix(migrate): handle existing Company/UnifiSite data in catch-up migration
Two bugs in the catch-up migration that only manifest with real production data: 1. Company (4520 rows): uid was added as TEXT NOT NULL DEFAULT '' causing all existing rows to get uid='' which makes the PRIMARY KEY constraint fail with 'could not create unique index, Key (uid)=() is duplicated'. Fix: add uid as nullable, UPDATE uid = id (copies the existing CUID text PK into uid), then SET NOT NULL, then swap PK. Also populate the new integer id column from cw_CompanyId (which is fully populated in prod). 2. UnifiSite (180 rows): old approach just dropped the text companyId and added a null integer column, destroying all company relationships. Fix: add companyId_int, UPDATE via JOIN on Company.uid (= old Company.id text), drop old text column, rename integer column. Also fix the P3009 handler in migrate-entrypoint.sh: Prisma may emit ANSI color codes even without a TTY, wrapping backticks in escape sequences and breaking the regex match. Fix: strip ANSI codes with sed before extracting the migration name. Also simplify the regex from a rigid format match to a simpler backtick-content grep. Production DB manually unblocked (migrate resolve --rolled-back) so the next deploy will cleanly apply the corrected migration.
This commit is contained in:
@@ -26,8 +26,11 @@ while [ $ATTEMPT -lt $MAX_RETRIES ]; do
|
||||
# P3009: a previously-failed migration is blocking deploy.
|
||||
# The error message contains the migration name in backticks:
|
||||
# The `20260402000000_fix_severity_typo` migration started at ... failed
|
||||
if echo "$DEPLOY_OUTPUT" | grep -q "P3009"; then
|
||||
FAILED=$(echo "$DEPLOY_OUTPUT" | grep -oE '\`[0-9]{14}(_[a-zA-Z_]+)?\`' | tr -d '\`' | head -1)
|
||||
# Strip ANSI escape codes first (Prisma may colorize output even without TTY),
|
||||
# then use a simple backtick-content regex rather than a rigid format match.
|
||||
CLEAN_OUTPUT=$(printf '%s\n' "$DEPLOY_OUTPUT" | sed 's/\x1b\[[0-9;]*[mGKHFJr]//g')
|
||||
if printf '%s\n' "$CLEAN_OUTPUT" | grep -q "P3009"; then
|
||||
FAILED=$(printf '%s\n' "$CLEAN_OUTPUT" | grep -o '`[^`]*`' | grep '[0-9]' | tr -d '`' | head -1)
|
||||
if [ -n "$FAILED" ]; then
|
||||
echo "[migrate] Resolving failed migration as rolled-back: $FAILED"
|
||||
RESOLVE_OUTPUT=""
|
||||
|
||||
Reference in New Issue
Block a user