## TL;DR

Set an explicit `tableName` on the model matching the real table (usually lowercase plural). Sequelize pluralizes the model name (`User` becomes `Users`) and sends it quoted to Postgres, where quoted `"Users"` is case-sensitive and never matches the lowercase `users` table. One option on the model fixes every query.

```text
SequelizeDatabaseError: relation "Users" does not exist
```

## Steps

1. Check the real table name in your database client by listing tables.
   Expected: you see `users` (lowercase), not `Users`.

2. Open the model definition and pin the table name:
   ```js
   const User = sequelize.define('User', { /* fields */ }, {
     tableName: 'users'
   });
   ```
   Expected: the model now points at the existing table.

3. If you want the model name used verbatim everywhere, add `freezeTableName: true` alongside `tableName`.
   Expected: no pluralization surprises on this model.

4. Run a simple read, e.g. `await User.findAll({ limit: 1 })`.
   Expected: rows come back, no SequelizeDatabaseError.

5. Grep the codebase for other models defined without `tableName`. On Postgres, every one of them is suspect.
   Expected: a short list of models to fix the same way.

## Use this when

- Postgres reports a capitalized relation does not exist
- Models were defined without an explicit `tableName`
- Migrations created lowercase tables but queries use capitalized names
- The error appears on the first query against a model, not on app boot

## Not for this skill when

- The table is genuinely missing (run your migrations)
- The wrong database or schema is in use (search_path issue, not a naming issue)
- You are on MySQL with case-insensitive table names (different behavior, different problem)
- The model points at a view or a renamed table (fix the mapping, not the case)

## Variant phrasings

- sequelize relation does not exist case sensitive postgres
- sequelize plural table name postgres error
- SequelizeDatabaseError relation not exist model name
- sequelize tableName lowercase fix

## Why it happens

Sequelize's default is table name = pluralized model name, sent quoted to Postgres. Postgres folds unquoted identifiers to lowercase at creation time (migrations usually create `users`), but a quoted `"Users"` in a query is looked up case-sensitively and misses. The mismatch is invisible until the first query runs, because model definition never touches the database.

## Edge cases

- `underscored: true` changes column naming, not the table-name case problem. You still need `tableName`.
- If a bad migration created the table quoted as `"Users"`, the fix is the opposite: rename the table to lowercase once.
- Schema-qualified setups also need the `schema` option; `tableName` alone will not find a table in another schema.
- Associations derive join table names from both models, so check those mappings too.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_OFtzZJQCmsfAxaneRFVYKg
