Come fare in modo che Sequelize utilizzi nomi di tabella singolari


109

Ho un modello chiamato User ma Sequelize cerca la tabella USERS ogni volta che provo a salvare nel DB. Qualcuno sa come impostare Sequelize per utilizzare nomi di tabelle singolari? Grazie.


3
userè una parola riservata, avrai un sacco di problemi se provi davvero a creare una tabella con quel nome.
a_horse_with_no_name

1
usernon è una parola riservata, ma una parola chiave. Anche se non incontrerai problemi nell'usarlo, è bene evitarlo. dev.mysql.com/doc/refman/5.5/en/keywords.html
Nirmal

Risposte:


224

I documenti affermano che puoi utilizzare la proprietàfreezeTableName .

Dai un'occhiata a questo esempio:

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
Ho aggiornato il collegamento nella tua domanda perché era rotto, spero non ti dispiaccia!
Maria Ines Parnisari

1
freezeTableName: truenon funziona nell'ultima versione di sequelize. Qualche altra soluzione?
Muhammad Yasir

2
Uno svantaggio freezeTableNameè che impedisce anche a sqlz di inserire in minuscolo i nomi di tabelle e colonne. Il che significa che in seguito, quando scrivi a mano SQL per scavare nei dati, devi far fronte a nomi con maiuscole e minuscole (qualunque cosa significhi per il tuo dialetto). Su pg, significa dover usare virgolette doppie attorno a ogni nome con maiuscole e minuscole - yuk! Vorrei che potessimo rinunciare alla pluralizzazione ma mantenere la piegatura dei casi ... defineha l' tableNameopzione per l'override esplicito.
Tom

1
utilizzare freezeTableName: truein aggiunta amodelName: 'singularName'
Naor Levi

97

Sebbene la risposta accettata sia corretta, puoi farlo una volta per tutte le tabelle invece di doverlo fare separatamente per ognuna. Devi semplicemente passare un oggetto opzioni simile nel costruttore Sequelize, in questo modo:

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)

Ora, quando definisci le tue entità, non devi specificare freezeTableName: true:

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

3
Grazie per l'avviso, ecco il link alla documentazione per chi fosse interessato.
ozanmuyes

0

Se è necessario disporre di nomi di modello diversi per le definizioni singolare e plurale, è possibile passare nome come parametro nelle opzioni del modello.

Dai un'occhiata a questo esempio:

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

questo restituirà "persona" come oggetto quando viene richiesto un singolo record e "persone" come array quando recuperiamo più record.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.