Cómo hacer que Sequelize use nombres de tablas en singular


109

Tengo un modelo llamado Usuario pero Sequelize busca la tabla USUARIOS cada vez que intento guardar en la base de datos. ¿Alguien sabe cómo configurar Sequelize para usar nombres de tablas en singular? Gracias.


3
useres una palabra reservada, tendrás muchos problemas si realmente intentas crear una tabla con ese nombre.
a_horse_with_no_name

1
userno es una palabra reservada, sino una palabra clave. Si bien no encontrará ningún problema al usarlo, es bueno evitarlo. dev.mysql.com/doc/refman/5.5/en/keywords.html
Nirmal

Respuestas:


224

Los documentos indican que puede usar la propiedad freezeTableName.

Por favor, mire este ejemplo:

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'
})

2
Actualicé el enlace en su pregunta porque estaba roto, ¡espero que no le importe!
Maria Ines Parnisari

1
freezeTableName: trueno funciona en la última versión de sequelize. ¿Alguna otra solución?
Muhammad Yasir

2
Una desventaja freezeTableNamees que también evita que sqlz ponga en minúsculas los nombres de tablas y columnas. Lo que significa que más adelante, cuando esté escribiendo SQL a mano para explorar datos, tendrá que lidiar con nombres de mayúsculas y minúsculas (lo que sea que eso signifique para su dialecto). En la página, significa tener que usar comillas dobles alrededor de cada nombre de mayúsculas y minúsculas, ¡puaj! Ojalá pudiéramos optar por no participar en la pluralización pero mantener el plegado de mayúsculas y minúsculas ... definetiene la tableNameopción de anulación explícita.
Tom

1
usar freezeTableName: trueademás demodelName: 'singularName'
Naor Levi

97

Si bien la respuesta aceptada es correcta, puede hacer esto una vez para todas las tablas en lugar de tener que hacerlo por separado para cada una. Simplemente pasa un objeto de opciones similar al constructor Sequelize, así:

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)

Ahora, cuando defina sus entidades, no tiene que especificar freezeTableName: true:

var Project = sequelize.define('Project', {
    title: Sequelize.STRING,
    description: Sequelize.TEXT
})

3
Gracias por el aviso, aquí está el enlace a la documentación para aquellos que estén interesados.
ozanmuyes

0

Si necesita tener diferentes nombres de modelo para las definiciones singuar y plural, puede pasar el nombre como parámetro en las opciones del modelo.

Por favor, mire este ejemplo:

    const People = sequelize.define('people', {
    name: DataTypes.STRING,
}, {
    hooks: {
        beforeCount (options) {
            options.raw = true;
        }
    },
    tableName: 'people',
    name: {
        singular: 'person',
        plural: 'people'
    }
});

esto devolverá "persona" como un objeto cuando se consulta un solo registro y "personas" como una matriz cuando buscamos varios registros.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.