Jak sprawić, by Sequelize używał pojedynczych nazw tabel

109

Mam model o nazwie User, ale Sequelize szuka tabeli USERS za każdym razem, gdy próbuję zapisać w bazie danych. Czy ktoś wie, jak ustawić Sequelize, aby używał pojedynczych nazw tabel? Dzięki.


źródło
3
userjest zarezerwowanym słowem, będziesz mieć mnóstwo problemów, jeśli naprawdę spróbujesz utworzyć tabelę o tej nazwie.
a_horse_with_no_name
1
usernie jest słowem zastrzeżonym, ale słowem kluczowym. Chociaż nie napotkasz problemu z używaniem go, dobrze jest go unikać. dev.mysql.com/doc/refman/5.5/en/keywords.html
Nirmal

Odpowiedzi:

224

W Docs stwierdzać, że można korzystać z nieruchomości freezeTableName.

Spójrz na ten przykład:

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
źródło
2
Zaktualizowałem link w Twoim pytaniu, ponieważ został uszkodzony. Mam nadzieję, że nie masz nic przeciwko!
Maria Ines Parnisari
1
freezeTableName: truenie działa w najnowszej wersji sequelize. Jakieś inne rozwiązanie?
Muhammad Yasir
2
Jednym minusem freezeTableNamejest to, że również zapobiega sqlz z lowercasing nazwy tabel i kolumn. Co oznacza, że ​​później, kiedy ręcznie piszesz SQL, aby przekopać się przez dane, będziesz musiał radzić sobie z nazwami o różnej wielkości (cokolwiek to oznacza dla twojego dialektu). Na stronie pg oznacza to konieczność używania podwójnych cudzysłowów wokół każdej nazwy składającej się z różnych wielkości liter - fuj! Chciałbym móc zrezygnować z liczby mnogiej, ale zachować składanie wielkości liter ... definema tableNameopcję jawnego zastąpienia.
Tom
1
użyj freezeTableName: truedodatkowomodelName: 'singularName'
Naor Levi
97

Chociaż zaakceptowana odpowiedź jest poprawna, możesz to zrobić raz dla wszystkich tabel, zamiast robić to oddzielnie dla każdego z nich. Po prostu przekazujesz podobny obiekt opcji do konstruktora Sequelize, na przykład:

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)

Teraz, kiedy definiujesz swoje encje, nie musisz określać freezeTableName: true:

var Project = sequelize.define('Project', {
    title: Sequelize.STRING,
    description: Sequelize.TEXT
})
d512
źródło
3
Dzięki za ostrzeżenie, tutaj jest link do dokumentacji dla zainteresowanych.
ozanmuyes
0

Jeśli potrzebujesz różnych nazw modeli dla definicji singuar i liczby mnogiej, możesz przekazać nazwę jako parametr w opcjach modelu.

Spójrz na ten przykład:

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

zwróci to „osobę” jako obiekt, gdy odpytywany jest pojedynczy rekord, oraz „people” jako tablicę, gdy pobieramy wiele rekordów.

Nidin Pereira
źródło