Como fazer o Sequelize usar nomes de tabelas no singular

109

Tenho um modelo chamado User mas o Sequelize procura a tabela USERS sempre que tento salvar no DB. Alguém sabe como definir Sequelize para usar nomes de tabelas no singular? Obrigado.


fonte
3
useré uma palavra reservada, você terá muitos problemas se realmente tentar criar uma tabela com esse nome.
a_horse_with_no_name
1
usernão é uma palavra reservada, mas uma palavra-chave. Embora você não encontre problemas ao usá-lo, é bom evitá-lo. dev.mysql.com/doc/refman/5.5/en/keywords.html
Nirmal

Respostas:

224

Os documentos afirmam que você pode usar a propriedade freezeTableName.

Por favor, dê uma olhada neste exemplo:

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'
})
Luis Carlos Chavarría
fonte
2
Atualizei o link da sua pergunta porque ele estava quebrado, espero que você não se importe!
Maria Ines Parnisari
1
freezeTableName: truenão está funcionando na versão mais recente do sequelize. Alguma outra solução?
Muhammad Yasir
2
Uma desvantagem freezeTableNameé que também evita que o sqlz coloque nomes de tabelas e colunas em letras minúsculas. O que significa que mais tarde, quando você estiver escrevendo SQL à mão para vasculhar os dados, terá que lidar com nomes de maiúsculas e minúsculas (o que quer que isso signifique para o seu dialeto). Na pg, significa ter que usar aspas duplas em todos os nomes de maiúsculas e minúsculas - yuk! Eu gostaria que pudéssemos cancelar a pluralização, mas manter a dobra de caixa ... definetem a tableNameopção de substituição explícita.
Tom
1
use freezeTableName: truealém demodelName: 'singularName'
Naor Levi
97

Embora a resposta aceita seja correta, você pode fazer isso uma vez para todas as tabelas, em vez de ter que fazer isso separadamente para cada uma. Você simplesmente passa um objeto de opções semelhantes para o construtor Sequelize, assim:

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)

Agora, quando você define suas entidades, não precisa especificar freezeTableName: true:

var Project = sequelize.define('Project', {
    title: Sequelize.STRING,
    description: Sequelize.TEXT
})
d512
fonte
3
Obrigado pelo aviso, aqui está o link de documentação para os interessados.
ozanmuyes
0

Se você precisar de nomes de modelo diferentes para definições singulares e plurais, você pode passar o nome como um parâmetro nas opções de modelo.

Por favor, dê uma olhada neste exemplo:

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

isso retornará "pessoa" como um objeto quando um único registro está sendo consultado e "pessoas" como um array quando buscamos vários registros.

Nidin Pereira
fonte