So lassen Sie Sequelize singuläre Tabellennamen verwenden

109

Ich habe ein Modell namens User, aber Sequelize sucht nach der Tabelle USERS, wenn ich versuche, in der Datenbank zu speichern. Weiß jemand, wie man Sequelize so einstellt, dass einzelne Tabellennamen verwendet werden? Vielen Dank.


quelle
3
userist ein reserviertes Wort, Sie werden viele Probleme haben, wenn Sie wirklich versuchen, eine Tabelle mit diesem Namen zu erstellen.
a_horse_with_no_name
1
userist kein reserviertes Wort, sondern ein Schlüsselwort. Während Sie kein Problem bei der Verwendung haben, ist es gut, es zu vermeiden. dev.mysql.com/doc/refman/5.5/en/keywords.html
Nirmal

Antworten:

224

In den Dokumenten wird angegeben, dass Sie die Eigenschaft verwenden können freezeTableName.

Bitte schauen Sie sich dieses Beispiel an:

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
quelle
2
Ich habe den Link in Ihrer Frage aktualisiert, weil er defekt war. Ich hoffe, es macht Ihnen nichts aus!
Maria Ines Parnisari
1
freezeTableName: truefunktioniert nicht in der neuesten Version von Sequelize. Irgendeine andere Lösung?
Muhammad Yasir
2
Ein Nachteil freezeTableNameist, dass es auch verhindert, dass sqlz Tabellen- und Spaltennamen in Kleinbuchstaben umwandelt. Das bedeutet, dass Sie später, wenn Sie SQL von Hand schreiben, um Daten zu durchsuchen, mit Namen in Groß- und Kleinschreibung umgehen müssen (was auch immer das für Ihren Dialekt bedeutet). Auf Seite bedeutet dies, dass für jeden Namen in Groß- und Kleinschreibung doppelte Anführungszeichen verwendet werden müssen - yuk! Ich wünschte, wir könnten die Pluralisierung ablehnen, aber die Fallfaltung beibehalten ... definehat die tableNameOption für eine explizite Überschreibung.
Tom
1
Verwendung freezeTableName: truezusätzlich zumodelName: 'singularName'
Naor Levi
97

Während die akzeptierte Antwort korrekt ist, können Sie dies einmal für alle Tabellen tun, anstatt es für jede Tabelle separat tun zu müssen. Sie übergeben einfach ein ähnliches Optionsobjekt wie folgt an den Sequelize-Konstruktor:

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)

Wenn Sie nun Ihre Entitäten definieren, müssen Sie nicht angeben freezeTableName: true:

var Project = sequelize.define('Project', {
    title: Sequelize.STRING,
    description: Sequelize.TEXT
})
d512
quelle
3
Vielen Dank für das Heads-up. Hier ist der Link zur Dokumentation für Interessierte.
Ozanmuyes