{"record":{"id":"d2c4eb529d390378","repo":"ankane/pghero","slug":"database-not-found-database","errorCode":null,"errorMessage":"Database not found: #{database}","messagePattern":"Database not found: #(.+?)","errorType":"exception","errorClass":"PgHero::Error","httpStatus":null,"severity":"error","filePath":"lib/pghero/methods/query_stats.rb","lineNumber":96,"sourceCode":"        true\n      rescue ActiveRecord::StatementInvalid\n        false\n      end\n\n      def enable_query_stats\n        execute(\"CREATE EXTENSION IF NOT EXISTS pg_stat_statements\")\n        true\n      end\n\n      def disable_query_stats\n        execute(\"DROP EXTENSION IF EXISTS pg_stat_statements\")\n        true\n      end\n\n      def reset_query_stats(user: nil, query_hash: nil, raise_errors: false)\n        database = database_name\n        database_id = select_one(\"SELECT oid FROM pg_database WHERE datname = :database\", {database: database})\n        raise Error, \"Database not found: #{database}\" unless database_id\n\n        if user\n          user_id = select_one(\"SELECT usesysid FROM pg_user WHERE usename = :user\", {user: user})\n          raise Error, \"User not found: #{user}\" unless user_id\n        else\n          user_id = 0\n        end\n\n        if query_hash\n          query_id = query_hash.to_i\n          # may not be needed\n          # but not intuitive that all query hashes are reset with 0\n          raise Error, \"Invalid query hash: #{query_hash}\" if query_id == 0\n        else\n          query_id = 0\n        end\n\n        binds = {user_id: user_id, database_id: database_id, query_id: query_id}","sourceCodeStart":78,"sourceCodeEnd":114,"githubUrl":"https://github.com/ankane/pghero/blob/7edb57986ffd36f9d64f0830c4ccc90a5eac46d6/lib/pghero/methods/query_stats.rb#L78-L114","documentation":"reset_query_stats must pass the current database's oid to pg_stat_statements_reset(user_id, database_id, query_id). It looks the oid up with SELECT oid FROM pg_database WHERE datname = :database using database_name; if that catalog query returns nil, PgHero raises Error \"Database not found: {name}\". Since you are by definition connected to that database, a nil result points at the connection not reporting the name that actually appears in pg_database.","triggerScenarios":"Connecting through a pooler/proxy (pgbouncer, RDS Proxy) that authenticates against one database and routes to another, so current_database() differs from the catalog entry; unusual role permissions that hide the row in pg_database; a database_name that was renamed while a pooled connection stayed alive.","commonSituations":"Containerized deployments behind pgbouncer in transaction mode; managed Postgres with a proxy layer; retrying reset_query_stats after a database rename on a stale connection.","solutions":["Check what the server reports: run database.select_value(\"SELECT current_database()\") and compare with SELECT datname FROM pg_database","Connect directly to the target Postgres (bypass the pooler/proxy) for stats-reset operations","Reconnect after database renames so cached metadata is refreshed"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"db_name = database.select_value(\"SELECT current_database()\")\ndatabase.reset_query_stats if database.select_one(\"SELECT oid FROM pg_database WHERE datname = :d\", {d: db_name})","typeGuard":null,"tryCatchPattern":"begin\n  database.reset_query_stats\nrescue PgHero::Error => e\n  # catalog mismatch is environmental (pooler/proxy); log and continue rather than retrying\n  Rails.logger.warn(\"reset_query_stats skipped: #{e.message}\")\nend","preventionTips":["Point pghero directly at Postgres, not through pgbouncer/RDS Proxy, for admin operations","Reconnect after database renames so cached database metadata is refreshed"],"tags":["pghero","query-stats","postgres-catalog","pooler"],"backgroundTag":"resource-not-found","analyzedSha":"7edb57986ffd36f9d64f0830c4ccc90a5eac46d6","analyzedAt":"2026-08-21T17:33:54.942Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}