Comment faire en sorte que Sequelize utilise des noms de table singuliers


109

J'ai un modèle appelé User mais Sequelize recherche la table USERS chaque fois que j'essaie d'enregistrer dans la base de données. Est-ce que quelqu'un sait comment configurer Sequelize pour utiliser des noms de table singuliers? Merci.


3
userest un mot réservé, vous aurez beaucoup de problèmes si vous essayez vraiment de créer une table avec ce nom.
a_horse_with_no_name

1
usern'est pas un mot réservé, mais un mot-clé. Bien que vous ne rencontriez aucun problème lors de son utilisation, il est bon de l'éviter. dev.mysql.com/doc/refman/5.5/en/keywords.html
Nirmal

Réponses:


224

le documents indiquent que vous pouvez utiliser la propriétéfreezeTableName .

Veuillez jeter un œil à cet exemple:

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
J'ai mis à jour le lien dans votre question car il était cassé, j'espère que cela ne vous dérange pas!
Maria Ines Parnisari

1
freezeTableName: truene fonctionne pas dans la dernière version de sequelize. Une autre solution?
Muhammad Yasir

2
Un inconvénient freezeTableNameest qu'il empêche également sqlz de mettre en minuscules les noms de table et de colonne. Ce qui signifie que plus tard, lorsque vous écrivez à la main du SQL pour fouiller dans les données, vous devez faire face à des noms à casse mixte (quoi que cela signifie pour votre dialecte). Sur pg, cela signifie avoir à utiliser des guillemets doubles autour de chaque nom à casse mixte - yuk! J'aimerais que nous puissions désactiver la pluralisation mais conserver le pliage de la casse ... definea une tableNameoption pour le remplacement explicite.
Tom

1
utiliser freezeTableName: trueen plus demodelName: 'singularName'
Naor Levi

97

Bien que la réponse acceptée soit correcte, vous pouvez le faire une fois pour toutes les tables plutôt que de devoir le faire séparément pour chacun. Vous passez simplement un objet d'options similaire dans le constructeur Sequelize, comme ceci:

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)

Désormais, lorsque vous définissez vos entités, vous n'avez pas à spécifier freezeTableName: true:

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

3
Merci pour le heads-up, voici le lien vers la documentation pour ceux qui sont intéressés.
ozanmuyes

0

Si vous souhaitez avoir des noms de modèle différents pour les définitions au singulier et au pluriel, vous pouvez passer le nom en tant que paramètre dans les options du modèle.

Veuillez jeter un œil à cet exemple:

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

cela renverra "personne" en tant qu'objet lorsqu'un seul enregistrement est interrogé et "people" en tant que tableau lorsque nous récupérons plusieurs enregistrements.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.