plandex-ai/plandex · error

error getting owner role id: %v

Error message

error getting owner role id: %v

What it means

cacheOrgOwnerRoleId performs 'SELECT id FROM org_roles WHERE name = owner' via Conn.Get. Any driver-level failure — no rows (sql.ErrNoRows), connection error, or query error — is wrapped with this message and propagated up through GetOrgOwnerRoleId and CacheOrgRoleIds. It is the lowest-level RBAC lookup failure.

Source

Thrown at app/server/db/rbac_helpers.go:80

	err = cacheOrgMemberRoleId()
	if err != nil {
		return fmt.Errorf("error getting org member role id: %v", err)
	}

	if orgMemberRoleId == "" {
		log.Println("org member role id is empty at startup")
	}

	return nil
}

func cacheOrgOwnerRoleId() error {
	var roleId string
	err := Conn.Get(&roleId, "SELECT id FROM org_roles WHERE name = 'owner'")

	if err != nil {
		return fmt.Errorf("error getting owner role id: %v", err)
	}

	orgOwnerRoleId = roleId

	return nil
}

func cacheOrgMemberRoleId() error {
	var roleId string
	err := Conn.Get(&roleId, "SELECT id FROM org_roles WHERE name = 'member'")

	if err != nil {
		return fmt.Errorf("error getting member role id: %v", err)
	}

	orgMemberRoleId = roleId

	return nil

View on GitHub (pinned to e2d772072e)

Solutions

  1. Insert the 'owner' row: INSERT INTO org_roles (name) VALUES ('owner');
  2. Run pending migrations creating/seeding org_roles
  3. Check the inner error: sql.ErrNoRows means data missing, ping failure means connectivity
  4. Ensure MustInitDb/Conn initialization precedes any call

Example fix

// before
var roleId string
err := Conn.Get(&roleId, "SELECT id FROM org_roles WHERE name = 'owner'")
// after
var roleId string
err := Conn.Get(&roleId, "SELECT id FROM org_roles WHERE name = 'owner'")
if errors.Is(err, sql.ErrNoRows) {
	return fmt.Errorf("org_roles 'owner' row missing — run seed migrations")
}
Defensive patterns

Strategy: retry

Validate before calling

var n int
err := db.QueryRow("SELECT count(*) FROM org_roles WHERE name = 'owner'").Scan(&n)
if err != nil || n == 0 {
	return fmt.Errorf("owner role row missing")
}

Type guard

func isNoRows(err error) bool {
	return err != nil && (errors.Is(err, sql.ErrNoRows) || strings.Contains(err.Error(), "sql: no rows"))
}

Try / catch

roleId, err := GetOrgOwnerRoleId()
if err != nil {
	if isNoRows(err) {
		return retryWithBackoff(3, func() error { // only useful after seeding
			_, e := GetOrgOwnerRoleId()
			return e
		})
	}
	return fmt.Errorf("db connectivity issue: %w", err)
}

Prevention

When it happens

Trigger: First GetOrgOwnerRoleId/CacheOrgRoleIds call in a process where org_roles is empty or absent, the DB is down, or Conn is nil.

Common situations: sql.ErrNoRows from an unseeded database; connection refused after a DB restart; migrations pending on a new environment.

Related errors


AI-assisted analysis of plandex-ai/plandex@e2d772072e (2026-09-05). Data as JSON: /api/errors/0f962152db1f76d7. Report an issue: GitHub.