apache/answer · error

update question failed: %w

Error message

update question failed: %w

What it means

Returned by updateQuestionPostTime when updating an individual question's post_update_time column fails. The Get/find succeeded but the per-row Update() errored, aborting the migration. The driver error is wrapped with %w.

Source

Thrown at internal/migrations/v12.go:75

	return "question"
}

func updateQuestionPostTime(ctx context.Context, x *xorm.Engine) error {
	questionList := make([]QuestionPostTime, 0)
	err := x.Context(ctx).Find(&questionList, &entity.Question{})
	if err != nil {
		return fmt.Errorf("get questions failed: %w", err)
	}
	for _, item := range questionList {
		if item.PostUpdateTime.IsZero() {
			if !item.UpdatedAt.IsZero() {
				item.PostUpdateTime = item.UpdatedAt
			} else if !item.CreatedAt.IsZero() {
				item.PostUpdateTime = item.CreatedAt
			}
			if _, err = x.Context(ctx).Update(item, &QuestionPostTime{ID: item.ID}); err != nil {
				log.Errorf("update %+v config failed: %s", item, err)
				return fmt.Errorf("update question failed: %w", err)
			}
		}
	}

	return nil
}

View on GitHub (pinned to 3b9f137061)

Solutions

  1. Inspect the wrapped driver error for the failing statement
  2. Confirm the post_update_time column exists on the question table (run prior migrations first)
  3. Re-run the migration; already-updated rows are skipped via the IsZero() check
  4. Run the upgrade during low traffic to avoid lock contention

Example fix

// before
if _, err = x.Context(ctx).Update(item, &QuestionPostTime{ID: item.ID}); err != nil {
	log.Errorf("update %+v config failed: %s", item, err)
	return fmt.Errorf("update question failed: %w", err)
}
// after (collect failures instead of aborting at first row)
if _, err = x.Context(ctx).Update(item, &QuestionPostTime{ID: item.ID}); err != nil {
	failedIDs = append(failedIDs, item.ID)
	continue
}
Defensive patterns

Strategy: retry

Validate before calling

// confirm the target column exists before migrating
cols, _ := db.QueryString("SELECT column_name FROM information_schema.columns WHERE table_name='question'")
// must contain post_update_time

Try / catch

if err := runMigrations(); err != nil {
	if strings.Contains(err.Error(), "update question failed") {
		log.Printf("row update failed: %v; re-run migration, it skips fixed rows", err)
		return err
	}
}

Prevention

When it happens

Trigger: x.Context(ctx).Update(item, &QuestionPostTime{ID: item.ID}) returns non-nil err while backfilling post_update_time for questions with zero PostUpdateTime in the v12 migration.

Common situations: post_update_time column missing (partial upgrade); row locked by long-running traffic; connection lost mid-migration on a large dataset.

Related errors


AI-assisted analysis of apache/answer@3b9f137061 (2026-09-05). Data as JSON: /api/errors/b42231ef4b98c2ca. Report an issue: GitHub.