SequelizeDatabaseError: relation Users does not exist - model and table name case mismatch
Fixes Sequelize 'relation Users does not exist' caused by model/table name case mismatch. Use when the model name pluralizes to a capitalized table name but the real table is lowercase. Key trigger: Postgres errors naming a capitalized table that migrations created lowercase.
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.
SequelizeDatabaseError: relation "Users" does not existSteps
Check the real table name in your database client by listing tables. Expected: you see
users(lowercase), notUsers.Open the model definition and pin the table name:
const User = sequelize.define('User', { /* fields */ }, { tableName: 'users' });Expected: the model now points at the existing table.
If you want the model name used verbatim everywhere, add
freezeTableName: truealongsidetableName. Expected: no pluralization surprises on this model.Run a simple read, e.g.
await User.findAll({ limit: 1 }). Expected: rows come back, no SequelizeDatabaseError.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: truechanges column naming, not the table-name case problem. You still needtableName.- 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
schemaoption;tableNamealone 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