Як змусити Sequelize використовувати особливі імена таблиць


109

У мене є модель під назвою Користувач, але Sequelize шукає таблицю USERS, коли я намагаюся зберегти в БД. Хтось знає, як налаштувати Sequelize, щоб використовувати особливі імена таблиці? Дякую.


3
userце зарезервоване слово, у вас виникнуть безліч проблем, якщо ви дійсно спробуєте створити таблицю з таким іменем.
a_horse_with_no_name

1
userце не зарезервоване слово, а ключове слово. Хоча ви не зіткнетеся з проблемою, використовуючи її, добре уникати її. dev.mysql.com/doc/refman/5.5/uk/keywords.html
Nirmal

Відповіді:


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можливість явного переопрацювання.
Том

1
використання freezeTableName: trueдодатковоmodelName: 'singularName'
Наор Леві

97

Хоча прийнята відповідь правильна, ви можете зробити це один раз для всіх таблиць, а не робити це окремо для кожної. Ви просто передаєте подібний параметр об'єкта в конструктор 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
})

3
Дякуємо за керівництво, ось посилання на документацію для тих, хто цікавиться.
озанмуї

0

Якщо вам потрібно мати різні назви моделей для визначення сингулярного та множинного числа, ви можете передати ім'я як параметр у параметрах моделі.

Погляньте на цей приклад:

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

це поверне "людина" як об'єкт, коли запитується один запис, а "люди" - як масив, коли ми отримаємо кілька записів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.