Как смешать sequelize camel case и snake case?

#sequelize.js #camelcasing #snakecasing

#sequelize.js #camelcasing #snakecasing

Вопрос:

Используя Sequelize 6, у меня есть модель, связанная с таблицами, которая имеет заглавные буквы в одних столбцах и регистр змеи в других (столбцы не являются created_at или updated_at).

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

Пример кода:

   const someModel = sequelize.define('some_table', {
    'id': {
      type: dataTypes.BIGINT,
      primaryKey: true,
      autoIncrement: true,
    },
    'other_table_id': {
      type: dataTypes.BIGINT,
      allowNull: false,
      references: {
        model: 'other_table',
        key: 'id',
        deferrable: INITIALLY_IMMEDIATE,
      },
    },
    'CAPITAL_letterColumn': {
      type: dataTypes.STRING,
      allowNull: true,
      defaultValue: null,,
    }
  }, {
      timestamps: false,
      paranoid: false,
      // underscored: true, // true === snake case, false === camelcase
    }
  });

  someModel.associate = (models) => {
    someModel.belongsTo(models.other_table, { foreignKey: 'other_table_id', targetKey: 'id' });
  };
 

Я получаю следующую ошибку:

 UnhandledPromiseRejectionWarning: SequelizeDatabaseError: column "otherTableId" does not exist
 

Если я установлю

 underscored: true
 

Я получаю следующую ошибку:

 UnhandledPromiseRejectionWarning: SequelizeDatabaseError: column "c_a_p_i_t_a_l_letter_column" of relation "some_table" does not exist
 

Ответ №1:

Похоже, добавление атрибута field в определение модели устраняет проблему.

 'other_table_id': {
  field: 'other_table_id', // <-- this line 
  type: dataTypes.BIGINT,
  allowNull: false,
  references: {
    model: 'other_table',
    key: 'id',
    deferrable: INITIALLY_IMMEDIATE,
  },
},