How to make Sequelize use singular table names
I have an model called User but Sequelize looks for the table USERS whenever I am trying to save in the DB. Does anyone know how to set Sequelize to use singular table names? Thanks.
Solution 1:
The docs state that you can use the property freezeTableName
.
Please take a look at this example:
var Bar = sequelize.define('Bar', { /* bla */ }, {
// don't add the timestamp attributes (updatedAt, createdAt)
timestamps: false,
// don't delete database entries but set the newly added attribute deletedAt
// to the current date (when deletion was done). paranoid will only work if
// timestamps are enabled
paranoid: true,
// don't use camelcase for automatically added attributes but underscore style
// so updatedAt will be updated_at
underscored: true,
// disable the modification of tablenames; By default, sequelize will automatically
// transform all passed model names (first parameter of define) into plural.
// if you don't want that, set the following
freezeTableName: true,
// define the table's name
tableName: 'my_very_custom_table_name'
})
Solution 2:
While the accepted answer is correct, you can do this once for all tables rather than having to do it separately for each one. You simply pass in a similar options object into the Sequelize constructor, like so:
var Sequelize = require('sequelize');
//database wide options
var opts = {
define: {
//prevent sequelize from pluralizing table names
freezeTableName: true
}
}
var sequelize = new Sequelize('mysql://root:123abc@localhost:3306/mydatabase', opts)
Now when you define your entities, you don't have to specify freezeTableName: true
:
var Project = sequelize.define('Project', {
title: Sequelize.STRING,
description: Sequelize.TEXT
})
Solution 3:
You can Do it direct rather than specifying in every table you have define it once like below
var db_instance = new Sequelize(config.DB.database, config.DB.username, config.DB.password, {
host: config.DB.host,
dialect: config.DB.dialect,
define: {
timestamps: true,
freezeTableName: true
},
logging: false
});
OR
You can simply tell Sequelize the name of the table directly as well:
sequelize.define('User', {
// ... (attributes)
}, {
tableName: 'Employees'
});
You can see both Method in Documentation of sequelize.js
Doc. Of sequelize.js related to freezeTableName
Solution 4:
If you require to have different model names for singuar and plural definitions you can pass name as a parameter in options of model.
Please take a look at this example:
const People = sequelize.define('people', {
name: DataTypes.STRING,
}, {
hooks: {
beforeCount (options) {
options.raw = true;
}
},
tableName: 'people',
name: {
singular: 'person',
plural: 'people'
}
});
this will return "person" as an object when a single record is being queried and "people" as an array when we fetch multiple records.