How to make Sequelize use singular table names

后端 未结 4 1656
无人及你
无人及你 2020-12-04 10:13

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

相关标签:
4条回答
  • 2020-12-04 10:32

    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.

    0 讨论(0)
  • 2020-12-04 10:42

    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

    0 讨论(0)
  • 2020-12-04 10:46

    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'
    })
    
    0 讨论(0)
  • 2020-12-04 10:46

    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
    })
    
    0 讨论(0)
提交回复
热议问题