apache/answer · error
insert site info failed: %w
Error message
insert site info failed: %w
What it means
Fires in the v10 migration addLoginLimitations when the INSERT of the default users site-info row (entity.SiteInfo type SiteTypeUsers) fails against the database. This means the migration could not seed the users site configuration (allow-update flags and default avatar); the wrapped cause is the SQL insert error (e.g. duplicate key, connection loss, schema mismatch).
Source
Thrown at internal/migrations/v10.go:87
}
if exist {
siteUsers.DefaultAvatar = gjson.Get(interfaceSiteInfo.Content, "default_avatar").String()
}
data, _ := json.Marshal(siteUsers)
exist, err = x.Context(ctx).Get(&entity.SiteInfo{Type: constant.SiteTypeUsers})
if err != nil {
return fmt.Errorf("get config failed: %w", err)
}
if !exist {
usersSiteInfo := &entity.SiteInfo{
Type: constant.SiteTypeUsers,
Content: string(data),
Status: 1,
}
_, err = x.Context(ctx).Insert(usersSiteInfo)
if err != nil {
return fmt.Errorf("insert site info failed: %w", err)
}
}
return nil
}
View on GitHub (pinned to 3b9f137061)
Solutions
- Check the wrapped DB error (duplicate key vs privilege)
- Grant INSERT privilege on site_info
- Run migrations from a single instance or use a lock to avoid duplicate inserts
- Verify site_info schema matches entity.SiteInfo then re-run
Defensive patterns
Strategy: validation
Validate before calling
// pre-check for existing users row to avoid duplicate-key races
has, _ := engine.SQL("SELECT COUNT(*) FROM site_info WHERE type=?", "users").Count()
if has > 0 {
return fmt.Errorf("users site info already exists; skip seeding")
} Try / catch
if err := migrations.Migrate(db); err != nil {
if strings.Contains(err.Error(), "insert site info failed") {
log.Errorf("could not seed users config (privileges or duplicate): %v", err)
}
return err
} Prevention
- Grant INSERT privilege on site_info to the migration user
- Prevent concurrent migration runs with a lock or single runner
- Keep entity.SiteInfo in sync with the actual table schema
- Use INSERT-if-absent semantics (unique index on type) to make seeding idempotent
When it happens
Trigger: x.Context(ctx).Insert(usersSiteInfo) errors: INSERT privilege denied, duplicate type='users' row inserted concurrently, table/column mismatch, or connection drop.
Common situations: Two migration processes racing to seed the same row; migration user read-only; site_info schema altered manually so required columns are missing.
Related errors
- insert first version failed: %v
- get config failed: %w
- update site info failed: %w
- %s failed: %s
- sync version failed: %v
AI-assisted analysis of apache/answer@3b9f137061 (2026-09-05).
Data as JSON: /api/errors/dfd87b9a91296e69.
Report an issue: GitHub.