Как заставить Sequelize использовать единственные имена таблиц

109

У меня есть модель под названием User, но Sequelize ищет таблицу USERS всякий раз, когда я пытаюсь сохранить ее в БД. Кто-нибудь знает, как настроить Sequelize на использование единственных имен таблиц? Спасибо.


источник
3
user- зарезервированное слово, у вас будет множество проблем, если вы действительно попытаетесь создать таблицу с таким именем.
a_horse_with_no_name
1
userне зарезервированное слово, а ключевое слово. Хотя у вас не возникнет проблем с его использованием, лучше избегать этого. dev.mysql.com/doc/refman/5.5/en/keywords.html
Нирмал

Ответы:

224

В документации указано, что вы можете использовать свойство freezeTableName.

Взгляните на этот пример:

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
Я обновил ссылку в вашем вопросе, потому что она не работает, надеюсь, вы не против!
Мария Инес Парнисари
1
freezeTableName: trueне работает в последней версии sequelize. Любое другое решение?
Мухаммад Ясир
2
Одним из недостатков freezeTableNameявляется то, что он также предотвращает ввод sqlz в нижний регистр имен таблиц и столбцов. Это означает, что позже, когда вы будете вручную писать SQL для рытья данных, вам придется иметь дело с именами в смешанном регистре (что бы это ни значило для вашего диалекта). На pg это означает необходимость заключать каждое имя в смешанном регистре в двойные кавычки - yuk! Хотелось бы, чтобы мы могли отказаться от множественного числа, но сохранить складывание регистра ... defineимеет tableNameвозможность явного переопределения.
Tom
1
использование freezeTableName: trueв дополнениеmodelName: 'singularName'
Наор Леви
98

Хотя принятый ответ верен, вы можете сделать это один раз для всех таблиц, вместо того, чтобы делать это отдельно для каждой. Вы просто передаете аналогичный объект параметров в конструктор Sequelize, например:

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)

Теперь, когда вы определяете свои сущности, вам не нужно указывать freezeTableName: true:

var Project = sequelize.define('Project', {
    title: Sequelize.STRING,
    description: Sequelize.TEXT
})
d512
источник
3
Спасибо за внимание, вот ссылка на документацию для тех, кому интересно.
ozanmuyes
0

Если вам нужно иметь разные имена моделей для определений единственного и множественного числа, вы можете передать имя в качестве параметра в опциях модели.

Взгляните на этот пример:

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

это вернет "person" как объект, когда запрашивается одна запись, и "people" как массив, когда мы получаем несколько записей.

Нидин Перейра
источник